Réduire l'utilisation de la mémoire avec WeakHashMap
-
20-09-2019 - |
Question
Dans le Javadoc WeakHashMap.html , a indiqué
"Chaque objet clé est dans un WeakHashMap stockée indirectement en tant que référent d'un référence faible. Par conséquent, une touche être automatiquement retiré seulement après les références faibles à l'intérieur, à la fois et à l'extérieur de la carte, ont été dégagé par le garbage collector ».
Et puis
Notez que peut renvoyer un objet de valeur indirectement à la clé par l'intermédiaire du WeakHashMap lui-même; qui est une valeur objet peut fortement se référer à certains autre objet clé associée dont objet de valeur, à son tour, se réfère fortement à la clé du premier objet de valeur.
Mais ne devrait pas la clé et la valeur doivent être utilisés référence faible dans WeakHashMap? à savoir s'il est faible sur la mémoire, GC libérera la mémoire détenue par l'objet de valeur (puisque l'objet de valeur très probablement plus de mémoire que l'objet clé dans la plupart des cas)?
Et si l'objet GC libérer de la valeur, l'objet clé peut être libre aussi bien?
En fait, je suis à la recherche d'un HashMap qui réduit l'utilisation de la mémoire quand il y a peu de mémoire (GC recueille la valeur et les objets clés si nécessaire).
Est-il possible en Java?
Merci.
La solution
références faibles sont inappropriées pour les caches - NetBeans fait, et peut aller stupide
. SoftReference
est ce que vous voulez. Il est assez difficile de faire les choses - donc copier la solution de quelqu'un d'autre. Certaines personnes conseillent gérer explicitement vous met en cache.
Reference
s ne fonctionnent qu'avec une référence unique. Il y avait une proposition d'ajouter « ephemerons » Java SE, mais je n'ai pas vu une mise en œuvre aller partout avec cela.
Autres conseils
L'idée est que vous pouvez utiliser cette carte comme structure de données « de consultation » qui ne conserve que la valeur de paires de clés en vie qui peut encore être fait référence à (via une clé). Pourtant, alors que l'idée de base est agréable, je me rappelle qu'il n'a pas été aussi utile que je l'espérais.