Quelqu'un peut-il expliquer la différence entre les références fortes, douces, faibles et fantômes et l'utilisation de celles-ci? [dupliquer]
Cette question a déjà une réponse ici:
J'ai essayé de comprendre la différence entre les différentes références mais la théorie ne provoque pas des idées pour moi de visualiser la même.
Quelqu'un pourrait-il expliquer brièvement les différents références?
Un exemple pour chacun ferait mieux.
3 réponses
Un autre bon article sur le sujet:
objets de référence Java ou comment J'ai appris à arrêter de M'inquiéter et à aimer OutOfMemoryError, avec de beaux diagrammes
Extrait:
Comme vous pouvez le deviner, l'ajout de trois nouveaux États optionnels au diagramme du cycle de vie de l'objet crée un désordre.
Bien que la documentation indique une progression logique de fortement accessible à travers doux, faible, et fantôme, à récupéré, la progression réelle dépend sur quels objets de référence votre programme crée.
Si vous créez unWeakReference
mais que vous ne créez pas deSoftReference
, un objet progresse directement de strongly-reachable à weakly-reachable à finalized à collected. cycle de vie de l'objet, avec des objets de référence
Il est également important de se rappeler que tous les objets ne sont pas attachés à des objets de référence - en fait, très peu d'entre eux devraient être .
un objet de référence est une couche d'indirection : Vous passez par la référence objet pour atteindre l'objet référé, et clairement vous ne voulez pas cette couche d'indirection tout au long de votre code.
La plupart des programmes, en fait, utilisera des objets de référence pour accéder à un nombre relativement faible d'objets que le programme crée.
Références et référents
Un objet de référence fournit une couche d'indirection entre votre code de programme et un autre objet, appelé le référent.
Chaque objet de référence est construit autour de son référent, et fournit une méthode get() pour accéder au référent. Une fois que vous avez créé une référence, vous ne pouvez pas modifier son référent. Une fois que le référent a été collecté, la méthode get () renvoie null. relations entre le code de l'application, la référence faible / faible et le référent
Encore plus d'exemples: programmation Java: package de références
Texte Alt http://www.pabrantes.net/blog/space/start/2007-09-16/1/referenceTypes.png
Cas 1: c'est le cas habituel où L'objet est dit fortement accessible.
Cas 2: Il y a deux chemins vers L'objet, donc le plus fort est choisi, qui est celui avec la référence forte d'où l'objet est fortement accessible.
Cas 3: Encore une fois, il y a deux chemins vers l'objet, le plus fort est la référence faible (puisque l'autre est une référence fantôme), donc l'objet est dit faiblement accessible.
Cas 4: il N'y a qu'un seul chemin et le maillon le plus faible est une référence faible, donc l'objet est faiblement accessible.
Cas 5: un seul chemin et le lien le plus faible est la référence fantôme, donc l'objet est accessible de manière fantôme.
Cas 6: Il y a maintenant deux chemins et le chemin le plus fort est celui avec une référence douce, donc l'objet est maintenant dit être doucement accessible.
Un article expliquant ces types de références (y compris des exemples): http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html
Il y a une règle très simple:
- les objets fortement référencés sont des bits de code standard comme
Object a = new Object()
. Les objets référencés ne sont pas des déchets tant que la référence (a
, ci-dessus) est "accessible". Par conséquent Tout ce qui n'a pas de référence forte accessible peut être considéré comme une poubelle.
Alors nous regardons les types de référence non-forts:
-
les objets faiblement référencés seront probablement collectés par la JVM dès qu'ils devenir admissible au GC (et le
WeakReference
autorisé). Une référence faible àa
ressembleraitnew WeakReference<Object>(a)
. Les références faibles sont utiles dans le cas où vous voulez un cache dans lequel les données ne sont nécessaires que si les clés existent aussi fortement accessibles ailleurs (par exemple HttpSessions) - les objets légèrement référencés resteront probablement dans la JVM jusqu'à ce qu'il ait absolument besoin de récupérer de la mémoire. Les références logicielles sont utiles pour les caches où les valeurs sont de longue durée mais peuvent être collectées si nécessaire
Je ne suis jamais trop sûr des fantômes!