Java Language Diversi tipi di riferimento

Esempio

java.lang.ref pacchetto java.lang.ref fornisce classi di oggetti di riferimento, che supportano un grado limitato di interazione con il garbage collector.

Java ha quattro tipi di riferimento principali. Loro sono:

  • Forte riferimento
  • Riferimento debole
  • Riferimento morbido
  • Riferimento Phantom

1. Forte riferimento

Questa è la solita forma di creazione di oggetti.

MyObject myObject = new MyObject();

Il titolare variabile ha un forte riferimento all'oggetto creato. Finché questa variabile è MyObject e contiene questo valore, l' MyObject non verrà raccolta dal garbage collector.

2. Riferimento debole

Quando non si desidera mantenere un oggetto più lungo e si deve cancellare / liberare la memoria allocata per un oggetto il prima possibile, questo è il modo per farlo.

WeakReference myObjectRef = new WeakReference(MyObject);

Semplicemente, un riferimento debole è un riferimento che non è abbastanza forte da costringere un oggetto a rimanere in memoria. I riferimenti deboli ti consentono di sfruttare l'abilità del garbage collector di determinare la raggiungibilità per te, quindi non devi farlo tu stesso.

Quando hai bisogno dell'oggetto che hai creato, usa semplicemente il metodo .get() :

myObjectRef.get();

Il seguente codice esemplificherà questo:

WeakReference myObjectRef = new WeakReference(MyObject);
System.out.println(myObjectRef.get()); // This will print the object reference address
System.gc();
System.out.println(myObjectRef.get()); // This will print 'null' if the GC cleaned up the object

3. Riferimento software

I riferimenti soft sono leggermente più forti dei riferimenti deboli. È possibile creare un oggetto di riferimento morbido come segue:

SoftReference myObjectRef = new SoftReference(MyObject);

Possono trattenere la memoria più fortemente del riferimento debole. Se disponi di risorse / risorse di memoria sufficienti, il garbage collector non pulirà i riferimenti software in modo altrettanto entusiasta come riferimenti deboli.

I riferimenti software sono pratici da utilizzare nella memorizzazione nella cache. È possibile creare oggetti di riferimento morbidi come cache, dove sono conservati fino a esaurimento della memoria. Quando la tua memoria non può fornire abbastanza risorse, il garbage collector rimuoverà i riferimenti software.

SoftReference myObjectRef = new SoftReference(MyObject);
System.out.println(myObjectRef.get()); // This will print the reference address of the Object
System.gc();
System.out.println(myObjectRef.get()); // This may or may not print the reference address of the Object

4. Riferimento Phantom

Questo è il tipo di referenziazione più debole. Se hai creato un riferimento a un oggetto usando Phantom Reference, il metodo get() restituirà sempre null!

L'uso di questo riferimento è che "Gli oggetti di riferimento Phantom, che vengono messi in coda dopo che il collector determina che i loro referenti potrebbero essere recuperati, vengono spesso utilizzati per pianificare le azioni di pulizia pre-mortem in un modo più flessibile di quanto sia possibile con Meccanismo di finalizzazione Java. " - Da Phantom Reference Javadoc di Oracle.

Puoi creare un oggetto di Phantom Reference come segue:

PhantomReference myObjectRef = new PhantomReference(MyObject);