package ar.com.javacuriosities.references; import ar.com.javacuriosities.references.util.Foo; import java.lang.ref.SoftReference; /* * Las SoftReference son similares a las Weak pero menos estrictas en cuando se debe liberar la memoria * dado que esperan a que la JVM este escasa de memoria. * * Un uso muy común de este tipo de referencias es para la implementación de una Cache. * Estas son liberadas usando un algoritmo LRU (Last Recent Used), además podemos pasarle parámetros a la JVM para modificar cierto comportamiento * * -XX:SoftRelLRUPolicyMSPerMB: El Default Value es 1000 e indica cuanto tiempo vamos a retener las Soft Reference por cada MB libre en el Heap. * * Las Soft Reference no tienen noción de su "peso": * - Memory Usage * - Computation time * - CPU Usage * * Usando este tipo de referencia aseguramos que antes de un OOM (Out of Memory) todas las * Soft Reference serán recolectadas */ public class Step3SoftReferences { public static void main(String[] args) { // Creamos una referencia a un objeto Foo del tipo Strong Reference Foo foo = new Foo(); System.out.println("Instance: " + foo); // Creamos un Soft Reference al objeto SoftReference<Foo> softReference = new SoftReference<Foo>(foo); // Hacemos al objeto elegible por el GC foo = null; // Sugerimos al GC correr System.gc(); // Seria NULL en caso de que la JVM este con escasa memoria System.out.println("Instance: " + softReference.get()); } }