JavaRush /Blog Java /Random-FR /Différences entre les références faibles, douces, fantôme...
theGrass
Niveau 24
Саратов

Différences entre les références faibles, douces, fantômes et régulières en Java

Publié dans le groupe Random-FR
Les références « faibles » et les références « douces » (WeakReference, SoftReference) ont été ajoutées à l' API Java il y a longtemps, mais tous les programmeurs ne les connaissent pas. Cela indique un manque de compréhension dans la compréhension de où et comment les utiliser. Les classes de référence sont particulièrement importantes dans le contexte du garbage collection . Comme nous le savons tous, le garbage collector lui-même libère la mémoire occupée par les objets, mais tous les programmeurs ne savent pas qu'il prend la décision de libérer de la mémoire en fonction du type de références disponibles pour l'objet. Différences entre les références faibles, douces, fantômes et régulières en Java - 1La principale différence entre SoftReference et WeakReference réside dans la manière dont le collecteur les utilisera. Il peut supprimer un objet à tout moment si seuls des liens faibles pointent vers lui, en revanche, les objets avec un lien logiciel ne seront collectés que lorsque la JVM aura réellement besoin de mémoire. En raison de ces caractéristiques des classes de référence, chacune d’elles a sa propre utilité. SoftReference peut être utilisé pour implémenter des caches et lorsque la JVM a besoin de mémoire, elle la libère en supprimant ces objets. Et les WeakReferences sont parfaits pour stocker des métadonnées, par exemple pour stocker un lien vers un ClassLoader. S'il n'y a pas de classes à charger, cela ne sert à rien de stocker une référence au ClassLoader , une référence faible rend le ClassLoader disponible pour la suppression dès que nous l'attribuons au lieu d'une référence Strong. Dans cet article, nous examinerons les différences entre les types de liens, notamment la référence forte et la référence fantôme .

WeakReference vs SoftReference en Java

Pour ceux qui ne le savent pas, il existe 4 types de liens :
  1. Une référence forte
  2. Faible référence
  3. Référence douce
  4. Référence fantôme
Le lien fort est le plus simple, puisque nous l'utilisons quotidiennement en programmation, par exemple, dans un code comme String s = « abc » la variable s est le lien fort. Il est interdit à tout objet ayant une référence forte d'être supprimé par le ramasse-miettes. Bien entendu, ce sont des objets dont le programme Java a besoin. Les références faibles sont représentées par la classe java.lang.ref.WeakReference , vous pouvez définir une référence faible comme ceci :
Counter counter = new Counter(); // strong reference
WeakReference weakCounter = new WeakReference(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection
Désormais, une fois que vous avez défini le compteur de référence forte sur null (counter = null), l'objet créé dans la première ligne devient disponible pour le garbage collection car il n'a plus de référence forte. La référence WeakCounter créée par Weak ne peut pas empêcher le collecteur de supprimer l'objet Counter. En revanche, s'il s'agissait d'une référence Soft, l'objet Counter ne serait supprimé que lorsque la JVM aurait un besoin de mémoire particulièrement élevé. Les références logicielles en Java sont représentées par la classe java.lang.ref.SoftReference . Exemple de création d'une SoftReference en Java
Counter prime = new Counter();  // prime holds a strong reference
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object
prime = null;  // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory
Après avoir effacé la référence forte (en 3ème ligne), il ne restera qu'1 référence souple sur l'objet Counter, ce qui ne pourra pas empêcher le garbage collector de supprimer cet objet, mais contrairement à une référence faible, il pourra reporter ce processus jusqu'à ce qu'il y ait un manque aigu de mémoire. Compte tenu de cette différence entre liens souples et liens faibles, le premier est plus adapté aux caches, et faible aux métadonnées. Un bon exemple est la classe WeakHashMap, qui est un descendant de l'interface Map comme les classes HashMap ou TreeMap , mais avec une caractéristique distinctive. WeakHashMap encapsule les clés sous forme de références faibles, ce qui signifie que dès qu'il n'y a pas de références fortes à un objet, les références faibles situées à l'intérieur de WeakHashMap ne vous sauveront pas du garbage collector. Les liens fantômes sont le troisième type de liens disponibles dans le package java.lang.ref. Les références fantômes sont représentées par la classe java.lang.ref.PhantomReference . Un objet pointé uniquement par des liens fantômes peut être supprimé par le collecteur à tout moment. Un lien Phantom se crée de la même manière qu’un lien faible ou logiciel.
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
Une fois que vous avez effacé les références fortes à l'objet DigitalCounter, le garbage collector le supprimera à tout moment, puisque désormais seules les références fantômes pointent vers lui. En plus des classes WeakReference, SoftReference, PhantomReference, WeakHashMap, il est utile de connaître la classe ReferenceQueue . Vous pouvez utiliser cette classe lors de la création d'un objet WeakReference, SoftReference ou PhantomReference :
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference(digit, refQueue);
La référence d'objet sera ajoutée à ReferenceQueue et vous pourrez surveiller l'état des références en interrogeant ReferenceQueue. Le cycle de vie d'Object est bien représenté dans ce diagramme : Différences entre les références faibles, douces, fantômes et régulières en Java - 2c'est toutes les différences entre les références faibles et logicielles en Java . Nous nous sommes également familiarisés avec les liens fantômes, la classe WeakHashMap et ReferenceQueue . L'utilisation correcte des références facilitera le garbage collection et entraînera une gestion de la mémoire plus flexible en Java . Article original
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION