(Miguel esto seguro que te viene bien) 🙂
Las aplicaciones que necesitan almacenar muchos datos en memoria tarde o temprano llegan al temido java.lang.OutOfMemoryError y tienen que controlar el tamaño de los datos en memoria.
Por defecto todos los objetos en la caché de referencias son Hard References (la JVM puede limpiarlas sólo si son de dereferenciados).
Para solventar este problema aparece el concepto de las Soft References que a diferencia de las Hard Reference pueden ser recogidos por el Garbage Collector.
Existen 3 tipos de Sof References (cada una más débil): soft, weak, y phantom.
Las Soft References se deben usar para implementar cachés sensibles a disponer de poca memoria (la aplicación debe comprobar la existencia del objeto en la caché antes de invocar un método sobre el mismo. Si el objeto en caché se recogió por el GC entonces la aplicación tiene para recrear el objeto y volverlo a poner en la caché.
Y ahora el ejemplo (esta vez sin pantallazo para que lo podamos copiar :))
public class SoftCacheMap implements Map{
private final Map cacheMap;
private Thread cleanupThread;
private final ReferenceQueue clearedReferences;
…
private static class Entry extends SoftReference {
private final Object _key;
public Entry(Object key, Object value, ReferenceQueue queue) {
super(value, queue);
_key = key;
}
final Object getKey() {
return _key;
}
final Object getValue() {
return this.get();
}
}
public Object put(Object key, Object o) {
SoftReference refKey =new SoftCacheMap.Entry(key, o,clearedReferences);
Object obj = null;
synchronized (cacheMap) {
obj = cacheMap.put(key, refKey);
}
if(cacheMap.size() > peakSize)
peakSize = cacheMap.size();
if(!referenceQueueCleanupThread)
removeClearedReferences();
return obj;
}
public Object get(Object key) {
if(!referenceQueueCleanupThread)
removeClearedReferences();
if (cacheMap.size() > 0) {
SoftReference sr = (SoftReference)cacheMap.get(key);
synchronized (cacheMap) {
cacheMap.remove(key);
}
if(sr!=null)
return sr.get();
}
return null;
}
}

Replica a aironman2k Cancelar la respuesta