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.

29
demandé sur JoseK 2010-01-06 15:13:30

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

http://www.kdgregory.com/images/java.refobj/object_life_cycle_with_refobj.gif

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 un WeakReference mais que vous ne créez pas de SoftReference, 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

le texte d'alt


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.

21
répondu VonC 2015-04-21 06:47:56

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

7
répondu miku 2010-01-06 12:40:52

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 ressemblerait new 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!

3
répondu oxbow_lakes 2010-01-06 13:03:57