2015-09-01 15 views
5

Tôi đang cố gắng tìm ra số mà bạn chỉ định trong biểu tượng Guava CacheBuilder maximumSize() đại diện.Ổ đĩa ổi dung lượng tối đa Kích thước

Nói rằng tôi đã có một cái gì đó như thế này trong mã của tôi,

Cache<String, Object> programCache = CacheBuilder.newBuilder() 
    .maximumSize(1000) 
    .build(); 

Liệu 1000 mà tôi đã chỉ định như kích thước tối đa có nghĩa là tôi có thể có một ngàn mục khác nhau trong bộ nhớ cache trước khi nó bắt đầu đá ra LRU (bất kể kích thước vật thể có thể là gì)? Nếu đây là trường hợp, có giới hạn về kích thước của đối tượng không? Hoặc 1000 điều đó có nghĩa là tôi có 1000mb (MB đúng không?) Để làm việc và tôi có thể có nhiều đối tượng trong bộ đệm như tôi muốn lên đến 1000mb trước khi nó bắt đầu đá LRU?

+3

Điều đó có nghĩa là bộ nhớ cache sẽ không bao giờ vượt quá 1.000 mục nhập. Do thiết kế nội bộ, nó có thể đuổi ra khỏi ngưỡng đó. Để loại bỏ dựa trên kích thước đối tượng ([weight] (https://github.com/google/guava/wiki/CachesExplained#size-based-eviction)) sử dụng 'Weigher' và' maximumWeight'. Mặc dù không được khuyến nghị, bạn có thể sử dụng [jamm] (https://github.com/jbellis/jamm) để ước tính kích thước thời gian chạy. –

+0

Bạn có thể muốn xem qua Wiki của Google về cách chúng loại bỏ các mục trong bộ nhớ cache. Cụ thể cho câu hỏi của bạn, hãy xem [Gỡ bỏ dựa trên kích thước] (https://code.google.com/p/guava-libraries/wiki/CachesExplained#Size-based_Eviction). Tôi nghĩ rằng dòng này là thú vị - ** Cảnh báo: bộ nhớ cache có thể loại bỏ các mục trước khi vượt quá giới hạn này - thường là khi kích thước bộ nhớ cache đang đạt đến giới hạn **. – afrin216

+2

Không có giới hạn về kích thước của đối tượng. (Thậm chí cố gắng đo kích thước của các đối tượng Java theo byte là một nỗ lực tốn kém, khó hiểu, phụ thuộc vào nền tảng và dễ bị lỗi). –

Trả lời

2

Phương pháp maximumSize() đề cập đến số lượng tối đa (gần đúng) của các mục nhập trong bộ nhớ cache. Nó không đảm bảo về lượng bộ nhớ mà nội dung của bộ nhớ cache sẽ tiêu thụ (và khi Louis chỉ ra, không có cách nào hợp lý để bất kỳ đối tượng Java nào làm như vậy).

Nếu bạn có cách đo "chi phí" tương đối của bộ nhớ đệm một đối tượng cụ thể, bạn có thể chỉ định một maximumWeight() thay thế. Ví dụ: nếu bạn đang lưu vào bộ nhớ đệm byte[] trường hợp, bạn có thể sử dụng độ dài của chúng làm trọng lượng và điều này gần như phản ánh dấu chân bộ nhớ của chúng. Đối với các loại khác, bạn cần phải xác định khái niệm proxy thích hợp về "chi phí".

Các vấn đề liên quan