30 votes

Quelqu'un peut-il expliquer la différence entre les références Strong, Soft, Weak et Phantom et leur utilisation ?

J'ai essayé de comprendre la différence entre les différentes références mais la théorie ne me donne aucune idée pour visualiser la même chose.

Quelqu'un pourrait-il expliquer en bref les différentes références ?

Un exemple pour chacun ferait mieux l'affaire.

3 votes

Connexe mais de portée plus étroite : stackoverflow.com/questions/299659/

21voto

VonC Points 414372

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 d'un objet est une véritable catastrophe.
Bien que la documentation indique une progression logique de "fortement accessible" à "récupéré" en passant par "faible" et "fantôme", la progression réelle dépend des objets de référence créés par votre programme.
Si vous créez un WeakReference mais ne crée pas de SoftReference un objet passe directement de la catégorie "fortement accessible" à la catégorie "faiblement accessible", puis à la catégorie "finalisé" et enfin à la catégorie "collecté". cycle de vie des objets, avec des objets de référence

Il est également important de n'oubliez pas que tous les objets ne sont pas attachés à des objets de référence - en fait, très peu d'entre eux doivent l'être. .
Un objet de référence est une couche d'indirection Vous devez passer par l'objet de référence pour atteindre l'objet référencé, et il est clair que vous ne voulez pas de cette couche d'indirection dans votre code.
En fait, la plupart des programmes utilisent des objets de référence pour accéder à un nombre relativement faible d'objets créés par le programme.

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 changer 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 douce/faible et le référent

alt text


Encore plus d'exemples : Programmation Java : Paquet "Références

texte alternatif http://www.pabrantes.net/blog/space/start/2007-09-16/1/referenceTypes.png

  • Cas 1 : C'est le cas normal où l'on dit que l'objet est fortement atteignable.

  • Cas 2 : Il y a deux chemins vers l'objet, donc le plus fort est choisi, c'est celui qui a la référence forte, donc l'objet est fortement atteignable.

  • Cas 3 : Une fois encore, il existe deux chemins vers l'objet, le plus fort étant la référence faible (puisque l'autre est une référence fantôme), on dit donc que l'objet est faiblement accessible.

  • Cas 4 : Il n'y a qu'un seul chemin et le lien le plus faible est une référence faible, l'objet est donc faiblement atteignable.

  • Cas 5 : Un seul chemin et le lien le plus faible est la référence fantôme ; l'objet est donc 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 souple, donc on dit que l'objet est maintenant accessible de manière souple.

1 votes

+1 pour ne pas avoir simplement fourni une URL :)

0 votes

Après cela, pour jouer avec les différents modes gc : artima.com/insidejvm/ed2/gcP.html

0 votes

Programmation Java : References' Package m'a expliqué ce que je voulais. Maintenant, j'ai une idée claire de ce que sont les références.

7voto

miku Points 63392

Un article expliquant ces types de références (avec des exemples) : Comprendre les références faibles - weblogs.java.net (From the Web Archive)

1 votes

Lien brisé. C'est la raison pour laquelle nous devrions citer le contenu de la page au lieu de fournir un lien.

3voto

oxbow_lakes Points 70013

Il y a une règle très simple :

  • Les objets fortement référencés sont des éléments de code standard tels que Object a = new Object() . Le site Objets référencés ne sont pas des déchets tant que la référence ( a ci-dessus) est "atteignable". Par conséquent, tout ce qui n'a pas de référence forte accessible peut être considéré comme une ordure .

Nous examinons ensuite les types de référence non forts :

  • faiblement référencé seront probablement collectés par la JVM dès qu'ils deviendront éligibles pour la GC (et les objets de la WeakReference nettoyé). Une faible référence à 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 en tant que fortement accessibles ailleurs (par exemple, HttpSessions).
  • Référencé en douceur vont probablement traîner dans la JVM jusqu'à ce qu'elle ait absolument besoin de récupérer de la mémoire. Les références souples sont utiles pour les caches où les valeurs sont durables mais peuvent être récupérées si nécessaire.

Je ne suis jamais trop sûr des fantômes !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X