L’utilisation de références faibles est quelque chose que je n’ai jamais vu une implémentation de donc je vais essayer de comprendre ce qui est le cas d’utilisation pour eux et comment l’application fonctionnerait. Lorsque vous (ou vous) avait un besoin d’utiliser un WeakHashMap ou WeakReference et comment il pourrait être utilisé ?
Réponses
Trop de publicités?Un problème avec de solides références est la mise en cache, en particulier avec de très grandes structures comme des images. Supposons que vous avoir une application qui a pour travail avec fourni par l'utilisateur des images, comme l' site web de l'outil de conception je travaille sur. Bien sûr, vous voulez cache ces des images, car les charger à partir du disque est très coûteux et vous voulez éviter la possibilité d'avoir deux des copies de la (potentiellement gigantesque) l'image dans la mémoire à la fois.
Parce qu'une image cache est censé nous empêcher de rechargement des images lors de l' nous n'avons pas absolument nécessaire, vite compte que le cache doit toujours contenir une référence à un l'image de ce qui est déjà en mémoire. Avec ordinaire de solides références, bien que, qui font référence à lui-même obligera l' image reste en mémoire, ce qui vous oblige en quelque sorte à déterminer lors de l' l'image n'est plus nécessaire à la mémoire et le supprimer de la mémoire cache, de sorte qu'il devient admissible à la collecte des ordures. Vous êtes obligé de reproduire le comportement de la poubelle collecteur et de déterminer manuellement si un objet doit être dans de la mémoire.
La Compréhension Des Références Faibles, Ethan Nicolas
Une distinction doit être clair sur la différence entre un WeakReference
et SoftReference
.
Fondamentalement, un WeakReference
sera GC-d par la JVM avec impatience, une fois que l'objet référencé n'a pas dur de références. Un SoftReference
d objet sur l'autre main, ont tendance à être de gauche par le garbage collector, jusqu'à ce qu'il a vraiment besoin de récupérer de la mémoire.
Une cache où les valeurs sont tenues à l'intérieur WeakReference
s serait assez inutile (en WeakHashMap
, c'est les touches qui sont faiblement de référence). SoftReferences
sont utiles pour envelopper les valeurs autour de quand vous voulez mettre en œuvre un cache qui peut augmenter ou diminuer avec la mémoire disponible
Une utilisation Commune de WeakReferences et WeakHashMaps, en particulier, d'ajouter des propriétés aux objets. Parfois, vous souhaitez ajouter des fonctionnalités ou des données d'un objet, mais sous-classement et/ou la composition ne sont pas une option dans ce cas, la chose la plus évidente à faire serait de créer une table de hachage reliant l'objet que vous souhaitez étendre à la propriété que vous souhaitez ajouter. alors à chaque fois que vous avez besoin de la propriété, vous pouvez simplement rechercher dans la carte. Toutefois, si les objets sont l'ajout de propriétés à tendance à se détruit et créé beaucoup de choses, vous pouvez vous retrouver avec beaucoup de vieux objets de votre carte prend beaucoup de mémoire
si vous utilisez un WeakHashMap plutôt que les objets de laisser votre carte dès qu'ils ne sont plus utilisés par le reste de votre programme, ce qui est le comportement souhaité.
J'ai dû le faire pour ajouter des données à java.awt.Composant un changement dans le JRE entre 1.4.2 et 1.5, j'ai pu avoir fixé par le sous-classement de chaque composant, j'ai été intéressé int (JButton, JFrame, un Composite....) mais c'était beaucoup plus facile avec beaucoup moins de code.
Ce blog illustre l'utilisation de ces deux classes: Java: la synchronisation sur un ID. L'utilisation va quelque chose comme ceci:
private static IdMutexProvider MUTEX_PROVIDER = new IdMutexProvider();
public void performTask(String resourceId) {
IdMutexProvider.Mutex mutext = MUTEX_PROVIDER.getMutex(resourceId);
synchronized (mutext) {
// look up the resource and do something with it
}
}
IdMutextProvider fournit l'id des objets à base de synchroniser sur. Les exigences sont les suivantes:
- doit renvoyer une référence à l'objet même de l'utilisation simultanée de l'équivalent Id
- doit retourner un objet différent pour différents IDs
- aucun mécanisme de libération (les objets ne sont pas retournées à l'envoyeur)
- ne doit pas couler (objets inutilisés sont admissibles pour la collecte des ordures)
Ceci est réalisé à l'aide d'un stockage interne de la carte de type:
WeakHashMap<Mutex, WeakReference<Mutex>>
L'objet est à la fois la clé et la valeur. Lorsque rien d'externe à la carte a une dur de référence à l'objet, elle peut être nettoyée. Les valeurs dans la carte sont stockées avec dur références, de sorte que la valeur doit être enveloppé dans un WeakReference pour éviter une fuite de mémoire. Ce dernier point est abordé dans la javadoc.
Si par exemple vous souhaitez garder une trace de tous les objets créés d’une certaine classe. Pour toujours autoriser ces objets soient garbage collecté, vous gardez une liste/carte de références faibles aux objets au lieu des objets eux-mêmes.
Maintenant, si quelqu'un pouvait m’expliquer fantôme-références, je serais heureux...