2015-09-01 18 views
5

Ich versuche herauszufinden, was die Zahl, die Sie in Guava CacheBuilder maximumSize() angeben.Guava CacheBuilder maximumSize

sagen, dass ich so etwas in meinem Code haben,

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

Ist die 1000, die ich als die maximale Größe bedeuten angegeben, dass ich tausend verschiedene Einträge im Cache haben kann, bevor es zu treten beginnt die LRU (egal welche Größe das Objekt haben könnte)? Wenn dies der Fall ist, gibt es eine Grenze für die Größe des Objekts?

Oder bedeutet das 1000, dass ich eine 1000mb habe (ist MB korrekt?) Mit zu arbeiten und ich kann so viele der Objekte im Cache haben, wie ich will bis 1000mb, bevor es beginnt, die LRU zu treten?

+3

Dies bedeutet, dass der Cache nie 1.000 Einträge überschreitet. Aufgrund des internen Designs kann es vor diesem Schwellenwert geräumt werden. Um basierend auf der Objektgröße ([Gewicht] (https://github.com/google/guava/wiki/CachesExplained#size-based-eviction)) zu entfernen, verwenden Sie eine "Waage" und "maximumWeight". Obwohl nicht empfohlen, können Sie [jamm] (https://github.com/jbellis/jamm) verwenden, um die Laufzeitgröße zu schätzen. –

+0

Vielleicht möchten Sie das Guava-Wiki von Google durchsuchen, um zu erfahren, wie sie die Cache-Einträge entfernen. Sehen Sie sich speziell für Ihre Frage [Größenbasierte Räumung] an (https://code.google.com/p/guava-libraries/wiki/CachesExplained#Size-based_Eviction). Ich denke, diese Zeile ist interessant - ** Warnung: Der Cache kann Einträge löschen, bevor dieses Limit überschritten wird - in der Regel, wenn die Cache-Größe das Limit erreicht **. – afrin216

+2

Die Größe der Objekte ist nicht begrenzt. (Auch wenn Sie versuchen, die Größe von Java-Objekten in Byte zu messen, ist dies ein teures, verwirrendes, plattformabhängiges und fehleranfälliges Unterfangen.) –

Antwort

2

Die Methode maximumSize() bezieht sich auf die (ungefähre) maximale Anzahl von Einträgen im Cache. Es gibt keine Garantien darüber, wie viel Speicher der Cache-Inhalt verbrauchen wird (und wie Louis darauf hinweist, gibt es keinen vernünftigen Weg für irgendein Java-Objekt, dies zu tun).

Wenn Sie eine Möglichkeit haben, die relativen "Kosten" für das Caching eines bestimmten Objekts zu messen, können Sie stattdessen maximumWeight() angeben. Wenn Sie z. B. byte[] Instanzen zwischenspeichern, können Sie deren Länge als Gewicht verwenden und dies würde ungefähr ihren Speicherbedarf widerspiegeln. Für andere Typen müssen Sie einen geeigneten Proxy-Begriff "Kosten" ermitteln.