Ridurre l'utilizzo della memoria con WeakHashMap
-
20-09-2019 - |
Domanda
Nel Javadoc di WeakHashMap.html , ha detto
"Ogni oggetto chiave in un WeakHashMap è memorizzata indirettamente come il referente di un riferimento debole. Quindi una chiave sarà automaticamente essere rimosso solo dopo i riferimenti deboli ad esso, sia all'interno e al di fuori della mappa, sono stati eliminato dal garbage collector ".
E poi
Si noti che un oggetto di valore può riferirsi indirettamente alla sua chiave tramite il WeakHashMap stessa; ovvero un valore oggetto può fortemente riferimento ad alcune altro oggetto tasto il cui associato valore oggetto, a sua volta, si riferisce fortemente alla chiave del primo oggetto di valore.
Ma non dovrebbero entrambe chiave e il valore di riferimento devono essere utilizzati debole WeakHashMap? vale a dire se c'è poca memoria, GC liberare la memoria detenuta dal valore di oggetto (in quanto l'oggetto valore più probabile occupano più memoria di quella oggetto chiave nella maggior parte dei casi)?
E se GC liberare l'oggetto valore, l'oggetto chiave può essere libero così?
In sostanza, sto cercando un HashMap che ridurrà l'utilizzo di memoria quando non v'è la memoria bassa (GC raccoglie il valore e oggetti chiave se necessario).
E 'possibile in Java?
Grazie.
Soluzione
I riferimenti deboli sono inadeguate per le cache - NetBeans lo fa, e può andare sciocco
. SoftReference
è ciò che si desidera. In realtà è abbastanza difficile farlo bene - in modo da copiare la soluzione di qualcun altro. Alcune persone consigliano in modo esplicito la gestione di cache se stessi.
Reference
s funzionano solo con un unico riferimento. C'era una proposta per l'aggiunta di "ephemerons" per Java SE, ma non ho visto un'implementazione andare da nessuna parte con questo.
Altri suggerimenti
L'idea è che si può utilizzare questa mappa come struttura di dati "di ricerca", che mantiene solo i valore di coppie di chiavi vivi che ancora è possibile fare riferimento a (tramite un tasto). Eppure, mentre l'idea di base è bello, mi ricordo che non era utile come speravo che sarebbe stato.