Cos'è un caso d'uso per un riferimento soft in Java?


Che cos'è un caso d'uso per un riferimento soft in Java? Sarebbe utile raccogliere oggetti non critici quando una JVM ha esaurito la memoria per liberare risorse sufficienti per scaricare informazioni critiche prima di spegnere la JVM?

Sono chiamati soft-references in essi sono morbidi e si rompono quando "messi sotto stress" cioè:la JVM ha esaurito la memoria. Capisco riferimenti deboli e riferimenti fantasma ma non proprio quando questi sarebbero necessari.

Author: Michael Myers, 2010-03-11

4 answers

Un uso è per il caching. Immagina di voler mantenere una cache in memoria di oggetti di grandi dimensioni ma non vuoi che la cache consumi memoria che potrebbe essere utilizzata per altri scopi (poiché la cache può sempre essere ricostruita). Mantenendo una cache di riferimenti soft agli oggetti, gli oggetti referenziati possono essere liberati dalla JVM e la memoria occupata riutilizzata per altri scopi. La cache avrebbe semplicemente bisogno di cancellare i riferimenti soft rotti quando li incontra.

Un altro uso può essere per mantenere le immagini dell'applicazione su un dispositivo con vincoli di memoria, ad esempio un telefono cellulare. Quando l'utente apre le applicazioni, le immagini dell'applicazione precedente possono essere mantenute come riferimenti soft in modo che possano essere cancellate se la memoria è necessaria per qualcos'altro, ma saranno comunque presenti se non c'è richiesta di memoria. Ciò consentirà all'utente di tornare all'applicazione più rapidamente se non vi è alcuna pressione sulla memoria e consentire il recupero della memoria dell'applicazione precedente se è necessario per qualcos'altro.

 17
Author: Paul Ruane, 2010-03-10 23:49:35

Questo articolo mi ha dato una buona comprensione di ciascuno di essi (riferimenti deboli, morbidi e fantasma). Ecco una citazione riassunta:

Un riferimento debole , in poche parole, è un riferimento che non è abbastanza forte da forzare un oggetto a rimanere in memoria. I riferimenti deboli ti consentono di sfruttare la capacità del garbage collector di determinare la raggiungibilità per te, quindi non devi farlo da solo.

Un riferimento morbido è esattamente come un debole riferimento, tranne che è meno desideroso di buttare via l'oggetto a cui si riferisce. Un oggetto che è solo debolmente raggiungibile (i riferimenti più forti ad esso sono WeakReferences) verrà scartato al prossimo ciclo di garbage collection, ma un oggetto che è dolcemente raggiungibile generalmente rimarrà in giro per un po'.

Un riferimento fantasma è molto diverso da SoftReference o WeakReference. La sua presa sul suo oggetto è così tenue che non puoi nemmeno recuperare l'oggetto-il suo metodo get() restituisce sempre null. L'unico uso per tale riferimento è tenere traccia di quando viene accodato in un ReferenceQueue, poiché a quel punto sai che l'oggetto a cui punta è morto.

 16
Author: BalusC, 2010-03-10 23:56:58

Il miglior esempio che posso pensare è una cache. Potrebbe non dispiacerti scaricare le voci più vecchie nella cache se la memoria è diventata un problema. La memorizzazione nella cache di grafici di oggetti di grandi dimensioni potrebbe rendere probabile anche questo.

 3
Author: duffymo, 2010-03-10 23:48:40

Un esempio di come un SoftReference può essere utilizzato come cache può essere trovato in questo post.

 0
Author: Peter Fortuin, 2012-05-16 10:40:13