L'utilisation de références faibles est quelque chose dont je n'ai jamais vu d'implémentation, donc j'essaie de comprendre quel est leur cas d'utilisation et comment l'implémentation fonctionnerait. Quand avez-vous eu besoin d'utiliser un WeakHashMap
ou WeakReference
et comment l'a-t-il été?
java
weak-references
18 Lapin
la source
la source
Réponses:
Comprendre les références faibles , Ethan Nicholas
la source
WeakHashMap
.WeakReference
contreSoftReference
Une distinction sur laquelle il faut être clair est la différence entre a
WeakReference
et aSoftReference
.Fondamentalement, un
WeakReference
sera GC-d par la JVM avec impatience, une fois que l'objet référencé n'y aura pas de références matérielles . UnSoftReference
objet d, d'autre part, aura tendance à être laissé par le ramasse-miettes jusqu'à ce qu'il ait vraiment besoin de récupérer la mémoire.Un cache où les valeurs sont conservées dans
WeakReference
s serait assez inutile (dans aWeakHashMap
, ce sont les clés qui sont faiblement référencées).SoftReferences
sont utiles pour envelopper les valeurs lorsque vous souhaitez implémenter un cache qui peut augmenter et diminuer avec la mémoire disponible.la source
Une utilisation courante de
WeakReference
s etWeakHashMap
s en particulier consiste à ajouter des propriétés aux objets. Parfois, vous souhaitez ajouter des fonctionnalités ou des données à un objet, mais le sous-classement et / ou la composition ne sont pas une option.Dans ce cas, la chose évidente à faire serait de créer un hashmap reliant l'objet que vous souhaitez étendre à la propriété que vous souhaitez ajouter . puis chaque fois que vous avez besoin de la propriété, vous pouvez simplement la rechercher sur la carte. Cependant, si les objets auxquels vous ajoutez des propriétés ont tendance à être détruits et créés beaucoup, vous pouvez vous retrouver avec un grand nombre d'objets anciens dans votre carte occupant beaucoup de mémoire.Si vous utilisez à la
WeakHashMap
place, les objets quitteront votre carte dès qu'ils ne seront plus utilisés par le reste de votre programme, ce qui est le comportement souhaité.Je devais le faire pour ajouter quelques données
java.awt.Component
pour contourner un changement dans l'entre JRE et 1,5 1.4.2, je aurais pu la réparer par le sous - classement tous les composants que j'étais intéressé int (JButton
,JFrame
,JPanel
....) mais cela était beaucoup plus facile avec beaucoup moins de code.la source
Un autre cas utile pour
WeakHashMap
etWeakReference
est une implémentation de registre d'écoute .Lorsque vous créez quelque chose qui veut écouter certains événements, vous enregistrez généralement un auditeur, par exemple
Si le
manager
stocke votre auditeur avec unWeakReference
, cela signifie que vous n'avez pas besoin de supprimer le registre, par exemple avec unmanager.removeListener(myListenerImpl)
car il sera automatiquement supprimé une fois que votre auditeur ou votre composant contenant l'écouteur devient indisponible.Bien sûr, vous pouvez toujours supprimer manuellement votre auditeur, mais si vous ne le faites pas ou si vous l'oubliez, cela ne provoquera pas de fuite de mémoire et n'empêchera pas votre auditeur d'être récupéré.
D'où
WeakHashMap
vient la photo?Le registre d'écouteurs qui souhaite stocker les écouteurs enregistrés en tant que
WeakReference
s a besoin d'une collection pour stocker ces références. Il n'y a pas d'WeakHashSet
implémentation dans la bibliothèque standard Java seulementWeakHashMap
mais nous pouvons facilement utiliser cette dernière pour "implémenter" la fonctionnalité de la première:Avec cela
listenerSet
pour enregistrer un nouvel écouteur il suffit de l'ajouter à l'ensemble, et même s'il n'est pas supprimé explicitement, si l'écouteur n'est plus référencé, il sera automatiquement supprimé par la JVM.la source
WeakHashMap
est chaque fois que vous avez besoin d'unHashMap
objet. Donc , wow vous ne devez pas faire manuellement hashmap.remove jamais parce que les articles sont automagiquement enlevés une fois que l'obj est hors de portée! Littéralement magique! Un hack magique aussi laid est un facepalm complet .WeakReference
simplifie considérablement la base de code et évite les bogues inutiles liés à l'échec de la désinscription. Quel inconvénient?Ce billet de blog montre l'utilisation des deux classes: Java: synchronisation sur un ID . L'utilisation va quelque chose comme ceci:
IdMutextProvider fournit des objets basés sur l'ID sur lesquels se synchroniser. Les exigences sont:
Ceci est réalisé en utilisant une carte de stockage interne de type:
L'objet est à la fois clé et valeur. Lorsque rien d'extérieur à la carte n'a de référence ferme à l'objet, il peut être récupéré. Les valeurs de la carte sont stockées avec des références matérielles, de sorte que la valeur doit être encapsulée dans un WeakReference pour éviter une fuite de mémoire. Ce dernier point est traité dans le javadoc .
la source
Si vous voulez par exemple garder une trace de tous les objets créés d'une certaine classe. Pour continuer à permettre à ces objets d'être récupérés, vous conservez une liste / une carte des références faibles aux objets au lieu des objets eux-mêmes.
Maintenant, si quelqu'un pouvait m'expliquer des références fantômes, je serais heureux ...
la source
Comme indiqué ci-dessus, les références faibles sont conservées aussi longtemps qu'une référence forte existe.
Un exemple d'utilisation serait d'utiliser WeakReference dans les écouteurs, afin que les écouteurs ne soient plus actifs une fois que la référence principale à leur objet cible a disparu. Notez que cela ne signifie pas que WeakReference est supprimé de la liste des écouteurs, le nettoyage est toujours nécessaire mais peut être effectué, par exemple, à des heures planifiées. Cela a également pour effet d'empêcher l'objet écouté de contenir des références fortes et éventuellement d'être une source de ballonnement mémoire. Exemple: composants d'interface graphique Swing faisant référence à un modèle ayant un cycle de vie plus long que la fenêtre.
En jouant avec les auditeurs comme décrit ci-dessus, nous avons rapidement réalisé que les objets sont collectés «immédiatement» du point de vue de l'utilisateur.
la source
WeakReferences
votre commentaire est complètement faux!Une utilisation dans le monde réel que j'ai eue de WeakReferences est si vous avez un seul objet très grand qui est rarement utilisé. Vous ne voulez pas le garder en mémoire lorsqu'il n'est pas nécessaire; mais, si un autre thread a besoin du même objet, vous n'en voulez pas non plus deux en mémoire. Vous pouvez conserver quelque part une référence faible à l'objet et des références matérielles dans les méthodes qui l'utilisent; lorsque les deux méthodes se terminent, l'objet sera collecté.
la source
J'ai fait une recherche de code google pour "new WeakHashMap ()".
J'ai eu un tas de correspondances du projet de classpath GNU et
la source
vous pouvez utiliser lowhashmap pour implémenter une mise en cache sans ressources pour une création d'objets étendue.
mais notez qu'il n'est pas souhaitable d'avoir des objets mutables. Je l'ai utilisé pour mettre en cache les résultats de la requête (qui prennent environ 400 ms à exécuter) sur un moteur de recherche de texte, qui est rarement mis à jour.
la source