簡體   English   中英

如何計算字節數,而不是使用JavalinkedHashMap計數條目

[英]howto count bytes instead of entries with Java linkedHashMap

該LRU緩存實現基於JavalinkedHashMap

https://codereview.stackexchange.com/questions/80247/lru-cache-design-using-linkedhashmap

將removeEldestEntry中的逐出條件定義為size()> MAX_ENTRIES。 我寧願需要一種面向字節的驅逐機制,例如bytesCached> MAX_SIZE(MAX_SIZE是高速緩存的物理維)。

例如,如果bytesCached> 100MB而不是size()> 50,如何驅逐條目?

非常感謝。

.m

可能會有簡短和長期的答案。

簡短的答案是,從理論上講,您可以計算緩存中存儲的每個對象所占用的字節數,並計算它們的總和,以了解何時該將對象逐出。

更長的答案是,它不是那么簡單。 確實想像您有這樣的課:

class Simple {
    private int n;
    private byte b;
}

存儲此類的實例需要多少內存? 假設int為4個byte ,byte為另一個byte ,因此為5個字節。 我們不計算存儲對對象本身的引用所需的內存。

這種情況很簡單。 但是以下內容呢?

class Simple2 {
    private int n;
    private byte b;
    private String s;
}

您現在需要多少內存? 4+5+s.length*2 可能這是正確的。 但是String是類,因此s是引用。 該引用可以在其他對象(包括存儲在同一緩存中的對象)中重用。 您是否要計算兩次? 我不知道。

為了簡單起見,假設您要計算對象占用的全部內存。 這意味着您應該遞歸瀏覽對象並計算其成員占用的內存。 這是復雜且非常昂貴的過程。

幸運的是,您可以使用其他技術。 Java Instrumentation API允許估計對象占用的字節數。 此外,還有一個項目http://sizeof.sourceforge.net/ ,該項目實現了此功能並為您提供了簡單的API。

另一種可能性是,如果對象實現了可Serializable ,則將其Serializable ,然后檢查已Serializable化的對象的大小。 它甚至更加昂貴,並且要求您的類必須實現Serializable 另一方面,它不需要任何第三方依賴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM