Câu trả lời:
Kho lưu trữ trên heap đề cập đến các đối tượng sẽ có mặt trong vùng heap Java (và cũng chịu sự điều chỉnh của GC). Mặt khác, cửa hàng heap off đề cập đến các đối tượng (tuần tự hóa) được quản lý bởi EHCache, nhưng được lưu trữ bên ngoài heap (và cũng không chịu sự điều chỉnh của GC). Khi cửa hàng heap tiếp tục được quản lý trong bộ nhớ, nó chậm hơn một chút so với cửa hàng trên heap, nhưng vẫn nhanh hơn so với cửa hàng đĩa.
Các chi tiết nội bộ liên quan đến việc quản lý và sử dụng cửa hàng heap không rõ ràng trong liên kết được đăng trong câu hỏi, vì vậy sẽ rất khôn ngoan khi kiểm tra các chi tiết của Terracotta BigMemory , được sử dụng để quản lý đĩa ngoài cửa hàng. BigMemory (cửa hàng ngoài heap) sẽ được sử dụng để tránh chi phí hoạt động của GC trên một heap lớn vài Megabyte hoặc Gigabyte. BigMemory sử dụng không gian địa chỉ bộ nhớ của quy trình JVM, thông qua ByteBuffers trực tiếp không chịu sự điều chỉnh của GC không giống như các đối tượng Java gốc khác.
từ http://code.google.com.vn/p/fast-serialization/wiki/QuickStartHeap Offer
Heap-Offloading là gì?
Thông thường tất cả các đối tượng không tạm thời mà bạn phân bổ được quản lý bởi trình thu gom rác của java. Mặc dù VM thực hiện tốt công việc thu gom rác, nhưng tại một thời điểm nhất định, VM phải thực hiện cái gọi là 'Full GC'. Một GC đầy đủ liên quan đến việc quét Heap được phân bổ hoàn chỉnh, điều đó có nghĩa là các lần tạm dừng / chậm lại của GC tỷ lệ thuận với kích thước của heap ứng dụng. Vì vậy, đừng tin bất cứ ai nói với bạn 'Bộ nhớ là rẻ'. Trong tiêu thụ bộ nhớ java làm tổn thương hiệu suất. Ngoài ra, bạn có thể nhận được các tạm dừng đáng chú ý bằng cách sử dụng kích thước heap> 1 Gb. Điều này có thể khó chịu nếu bạn có bất kỳ nội dung gần thời gian thực nào đang diễn ra, trong một cụm hoặc lưới, một quy trình java có thể không phản hồi và bị loại khỏi cụm.
Tuy nhiên, các ứng dụng máy chủ ngày nay (thường được xây dựng dựa trên các khung bloaty ;-)) dễ dàng yêu cầu hàng đống vượt xa 4Gb.
Một giải pháp cho các yêu cầu bộ nhớ này là 'giảm tải' các phần của các đối tượng cho heap không java (được phân bổ trực tiếp từ HĐH). May mắn thay, java.nio cung cấp các lớp để phân bổ trực tiếp / đọc và ghi các phần bộ nhớ 'không được quản lý' (ngay cả các tệp ánh xạ bộ nhớ).
Vì vậy, người ta có thể phân bổ số lượng lớn bộ nhớ 'không được quản lý' và sử dụng điều này để lưu các đối tượng ở đó. Để lưu các đối tượng tùy ý vào bộ nhớ không được quản lý, giải pháp khả thi nhất là sử dụng Nối tiếp. Điều này có nghĩa là ứng dụng tuần tự hóa các đối tượng vào bộ nhớ ngoài, sau này đối tượng có thể được đọc bằng cách sử dụng giải tuần tự hóa.
Kích thước heap được quản lý bởi java VM có thể được giữ ở mức nhỏ, do đó, tạm dừng GC là trong millis, mọi người đều vui vẻ, hoàn thành công việc.
Rõ ràng là hiệu năng của bộ đệm heap như vậy phụ thuộc chủ yếu vào hiệu suất của việc thực hiện tuần tự hóa. Tin tốt: vì một số lý do FST-serialization khá nhanh :-).
Các kịch bản sử dụng mẫu:
Chỉnh sửa: Đối với một số trường hợp, người ta có thể chọn các thuật toán Bộ sưu tập Rác phức tạp hơn, chẳng hạn như ConcurrencyMarkAndSweep hoặc G1 để hỗ trợ các đống lớn hơn (nhưng điều này cũng có giới hạn vượt quá 16 GB). Ngoài ra còn có một JVM thương mại với cải tiến 'không ngừng' (Azul) được cải tiến.
Heap là nơi trong bộ nhớ nơi các đối tượng được phân bổ động của bạn sống. Nếu bạn đã sử dụng new
thì đó là trên đống. Điều đó trái ngược với không gian ngăn xếp, đó là nơi ngăn xếp chức năng sống. Nếu bạn có một biến cục bộ thì tham chiếu đó nằm trên ngăn xếp. Heap của Java là đối tượng thu gom rác và các đối tượng có thể sử dụng trực tiếp.
Bộ lưu trữ heap của EHCache đưa đối tượng thông thường của bạn ra khỏi heap, tuần tự hóa nó và lưu trữ dưới dạng byte trong một đoạn bộ nhớ mà EHCache quản lý. Nó giống như lưu trữ nó vào đĩa nhưng nó vẫn còn trong RAM. Các đối tượng không thể sử dụng trực tiếp trong trạng thái này, chúng phải được khử lưu huỳnh trước. Cũng không phải thu gom rác.
Không phải 100%; tuy nhiên, có vẻ như heap là một đối tượng hoặc tập hợp không gian được phân bổ (trên RAM) được tích hợp vào chức năng của mã hoặc chính Java hoặc nhiều khả năng là từ chính ehcache và Ram heap có hệ thống riêng như tốt; tuy nhiên, có vẻ như điều này chậm hơn một độ vì nó không được tổ chức, có nghĩa là nó có thể không sử dụng một đống (có nghĩa là một bộ không gian ram dài), và thay vào đó sử dụng các không gian địa chỉ khác nhau có thể làm cho nó kém hiệu quả hơn một chút.
Sau đó, tất nhiên tầng thấp hơn tiếp theo là không gian ổ cứng.
Tôi không sử dụng ehcache, vì vậy bạn có thể không muốn tin tôi, nhưng đó là những gì tôi thu thập được từ tài liệu của họ.