web-dev-qa-db-fra.com

Qu'est-ce qu'un WeakHashMap et quand l'utiliser?

Qu'est-ce qu'une WeakHashMap et quand doit-on l'utiliser? Quelles sont les différences entre une WeakHashMap et une HashMap?

136
developer

Les éléments d'un hashmap faible peuvent être récupérés par le ramasse-miettes s'il n'y a pas d'autres références fortes à l'objet clé, ce qui les rend utiles pour le stockage en mémoire cache/recherche.

Les références faibles ne sont pas limitées à ces tables de hachage, vous pouvez utiliser WeakReference pour un seul objet. Ils sont utiles pour économiser des ressources, vous pouvez garder une référence à quelque chose mais lui permettre d'être collecté quand rien d'autre ne le mentionne. (BTW, une référence forte est une référence Java normale). Il existe également des références faibles qui ont tendance à être moins facilement collectées que des références molles (qui ne tendent pas à rester longtemps après la disparition de la dernière référence forte)

77
vickirk

Comme d'autres l'ont déjà fait remarquer, une référence faible fournit un moyen d'utiliser un objet comme clé sans créer de référence forte. Ceci est utile dans les cas où vous ne souhaitez pas altérer la capacité de la JVM à collecter l'objet, mais souhaitez néanmoins pouvoir suivre certains aspects de l'objet, ce qui en fait une référence faible idéale pour la mise en cache ou le stockage de métadonnées sur l'objet .

Je suggérerais de lire "Comprendre les références faibles" (article du blog Oracle), à ​​propos de strong vs références faibles en Java. Sans une compréhension de la différence, la structure de données elle-même n'a pas beaucoup de sens. 

43
mmccomb

caisse Effective Java, Edition 2, page 26.

Les caches sont une autre source courante de fuites de mémoire. Une fois que vous mettez un référence d’objet dans une mémoire cache, il est facile d’oublier qu’elle est là et de la laisser dans le fichier cache longtemps après que cela devienne inutile. Il existe plusieurs solutions à ce problème . Si vous avez la chance d’implémenter un cache pour lequel une entrée est pertinente tant qu'il y a des références à sa clé en dehors du cache, représente le cache en tant que WeakHashMap ; les entrées seront automatiquement supprimées après qu'elles soient devenues obsolètes . N'oubliez pas que WeakHashMap n'est utile que si la durée de vie souhaitée du cache les entrées sont déterminées par des références externes à la clé et non par la valeur.

18
Hao Deng

De jGuru :

Un WeakHashMap est une carte spéciale mise en œuvre où les clés de la les cartes sont stockées dans un Java.lang.ref.WeakReference. Par stocker les clés dans une référence faible, les paires clé-valeur peuvent être dynamiquement laissé tomber de la carte quand le seul la référence à la clé vient du faible référence. Cela rend le WeakHashMap une excellente implémentation pour un liste faiblement référencée, où entrées qui ne sont pas utilisés ailleurs peuvent être chuté sans effets secondaires. Également, juste parce qu'une clé peut être abandonnée, ne veut pas dire que ce sera immédiatement chuté. Si le système en a suffisamment ressources, la clé faible référence que n'est pas référencé à l'extérieur pourrait rester autour depuis longtemps.

Plus sur Références :

11
Buhake Sindi

Les références faibles concernent l 'accessibilité et le fait de laisser le garbage collector (GC) faire le travail pour vous ..___. en action:

  • Un article IBM à propos de:

    Théorie et pratique de Java: Résoudre les fuites de mémoire avec des références faibles . Fuites de mémoire avec des cartes globales, identification des fuites de mémoire, références faibles au secours, ...

  • Un article de blog sur le moment d'utiliser WeakHashMap

    ... Si WeakHashMap n'est pas bon pour la mise en cache, alors à quoi sert-il? Il est bon d'implémenter des cartes canoniques. Disons que vous voulez associer des informations supplémentaires à un objet que vous avez une forte référence à. Vous mettez une entrée dans un WeakHashMap avec l'objet en tant que clé et l'information supplémentaire comme valeur de la carte. Ensuite, tant que vous gardez un forte référence à l'objet, vous pourrez vérifier la carte à récupérer les informations supplémentaires. Et une fois que vous relâchez l'objet, le l’entrée de la carte sera effacée et la mémoire utilisée par les informations supplémentaires sera publié. ...

  • Java documentation sur Java.lang.ref

7
Christophe Roussy

les gens l'utilisent pour implémenter la 'mémoire cache' . Si vous avez des objets réutilisés souvent dans votre application, et que leur construction est coûteuse, et qu'il y en a trop pour les conserver. les tousen mémoire -- vous utilisez WeakHashMap.

Mettez là l'objet qui n'est pas actuellement utilisé. Lorsque cet objet est nécessaire, sortez-le De la carte. La plupart du temps, la plupart de ces objets resteront sur la carte ... Le truc, c'est qu'ils ne sont pas tenus directement .__, mais par WeakReferences ..., donc s'ils deviennent vraiment "encombrés" , lorsque nous manquerons de mémoire, nous aurons le droit de les collecter les . Chaque fois que vous essayez d'extraire l'objet de le WeakHashMap, vous devez vous en assurer. .est toujours là. Sinon, vous devez le recréer.

4
Chetan Sharma

Vous pouvez utiliser un WeakHashmap pour réduire le risque de fuite de mémoire suite à la mise en cache d'un objet. WeakHashMap supprimera automatiquement les entrées lorsque toutes les références à la clé sont supprimées.

2
Gary Rowe

Weakhashmap permet à ses entrées d'être collectées sans attendre que le hashmap complet soit utilisé. Ainsi, il supprimera automatiquement les valeurs individuelles lorsque sa clé n’est plus utilisée normalement. 

Il peut être utilisé pour empêcher les fuites de mémoire, où hashmap ne sera jamais récupéré car une ou plusieurs clés sont encore utilisées, même si le maximum ne le sont pas, comme les données utilisateur, etc.

0
krmanish007