2012-03-29 12 views
7

La última versión de la excelente biblioteca de guayaba ha actualizado las API de almacenamiento en caché. CacheBuilder ahora tiene un método maxmimumWeight() para imponer un peso máximo sobre el caché. Los estados javadoc:¿Las cachés de guayaba consideran el peso en las elecciones de desalojo?

Especifica el peso máximo de las entradas que puede contener la memoria caché. El peso se determina usando el pesador especificado con pesadora, y el uso de este método requiere una llamada correspondiente a pesadora antes de llamar al compilación (com.google.common.cache.CacheLoader).

Tenga en cuenta que la memoria caché puede desalojar una entrada antes de que se exceda este límite. A medida que el tamaño de la memoria caché crece cerca del máximo, la memoria caché expulsa las entradas que es menos probable que se vuelvan a utilizar. Por ejemplo, la memoria caché puede desalojar una entrada porque no se ha utilizado recientemente o muy a menudo.

Cuando la memoria caché necesita desalojar una entrada, ¿considerará los pesos? Por ejemplo, puede ser mejor mantener varias entradas de pequeño peso que una entrada de gran peso, si la entrada de peso grande se usa con más frecuencia que cualquier artículo pequeño, pero con menos frecuencia que todos los artículos pequeños juntos.

+1

Los documentos ahora dicen "Tenga en cuenta que el peso solo se usa para determinar si la memoria caché está por encima de su capacidad, no tiene ningún efecto al seleccionar qué entrada debe desalojarse a continuación". http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/CacheBuilder.html#maximumSize(long) –

Respuesta

12

Miembro del equipo de Guava aquí.

A medida que el tamaño de la memoria caché crece cerca del máximo, la memoria caché expulsa entradas que es menos probable que se vuelvan a utilizar. Por ejemplo, la memoria caché puede desalojar una entrada porque no se ha utilizado recientemente o muy a menudo.

Si la memoria caché tiene algún otro comportamiento, no está documentada (y no se debe confiar en ella). Dicho esto, la implementación actual sólo se preocupa por la mayoría-se ha accedido recientemente, si nos fijamos en the source:

while (totalWeight > maxSegmentWeight) { 
    ReferenceEntry<K, V> e = getNextEvictable(); 
    if (!removeEntry(e, e.getHash(), RemovalCause.SIZE)) { 
    throw new AssertionError(); 
    } 
} 

y getNextEvictable repite con el fin de menos accedido recientemente.

Cuestiones relacionadas