Java: différence entre référence forte / douce / faible / fantôme


J'ai lu cet article sur le sujet, mais je ne comprends pas vraiment. Veuillez me donner quelques conseils ainsi que des exemples lors de la description des concepts.

Author: Matthias Braun, 2012-03-21

6 answers

Java fournit deux types/classes différents d'objets de référence : fort et faible. La faiblesse des Objets de Référence peuvent être divisés en soft et phantom. Allons point par point.

Objet de référence fort

StringBuilder builder = new StringBuilder();

C'est le type/classe par défaut de l'Objet de référence, s'il n'est pas spécifié différemment: builder est un objet de référence fort. Ce type de référence rend l'objet référencé non éligible au GC. C'est, chaque fois qu'un objet est référencé par une chaîne d'objets de référence forts, il ne peut pas être collecté.

Objet de référence faible

WeakReference<StringBuilder> weakBuilder = new WeakReference<StringBuilder>(builder);

Les objets de référence faibles ne sont pas le type/classe par défaut de l'objet de référence et pour être utilisés, ils doivent être explicitement spécifiés comme dans l'exemple ci-dessus. Ce type de référence rend l'objet de référence éligible au GC. Autrement dit, dans le cas où la seule référence accessible pour l'objet StringBuilder en mémoire est, en fait, le faible référence, alors le GC est autorisé à récupérer l'objet StringBuilder. Lorsqu'un objet en mémoire n'est accessible que par des objets de référence faibles, il devient automatiquement éligible pour GC.

Les Niveaux de Faiblesse

Deux niveaux différents de faiblesse peuvent être recrutés: soft et phantom.

Un objet de référence soft est fondamentalement un objet de référence faible qui reste un peu plus en mémoire: normalement, il résiste au cycle GC jusqu'à ce que la mémoire soit disponible et il n'y a aucun risque de OutOfMemoryError (dans ce cas, il peut être supprimé).

D'autre part, un objet de référence phantomn'est utile que pour savoir exactement quand un objet a été effectivement retiré de la mémoire: normalement, ils sont utilisés pour corriger bizarre finalize() revival/resurrection behavior, car ils ne renvoient pas l'objet lui-même mais aident seulement à garder une trace de leur présence en mémoire.

Les objets de référence faibles sont idéaux pour implémenter des modules de cache. En fait, une sorte d'expulsion automatique peut être implémentée en permettant au GC de nettoyer les zones de mémoire chaque fois que les objets/valeurs ne sont plus accessibles par une chaîne de références forte. Un exemple est le WeakHashMap conservant les clés faibles.

 114
Author: Paolo Maresca, 2018-06-29 05:25:19

Référence Faible :

Une référence faible, en termes simples, est une référence qui n'est pas assez forte pour forcer un objet à rester en mémoire. Les références faibles vous permettent de tirer parti de la capacité du garbage collector pour déterminer l'accessibilité pour vous, vous n'avez donc pas à le faire vous-même.

Référence souple:

Une référence douce est exactement comme une référence faible, sauf qu'elle est moins désireuse de jeter l'objet auquel elle se réfère. Un objet qui est seulement faiblement accessible (les références les plus fortes sont WeakReferences) sera supprimé au prochain cycle de récupération de place, mais un objet qui est facilement accessible restera généralement pendant un certain temps.

Référence fantôme:

Une référence fantôme est très différente de SoftReference ou de WeakReference. Son emprise sur son objet est si ténue que vous ne pouvez même pas récupérer l'objet-sa méthode get() renvoie toujours null. La seule utilisation pour une telle référence est garder une trace du moment où il est mis en file d'attente dans une ReferenceQueue, car à ce stade, vous savez que l'objet vers lequel il pointait est mort.

Ce texte a été extrait à partir de: https://weblogs.java.net/blog/2006/05/04/understanding-weak-references

 65
Author: Punith Raj, 2017-08-12 06:41:08

La simple différence entre SoftReference et WeakReference est fourni par Développeur Android.

La différence entre a SoftReference et a WeakReference est le moment où la décision est prise d'effacer et de mettre en file d'attente la référence:

  • A SoftReference devrait être effacé et mis en file d'attente aussi tard que possible, autrement dit, au cas où la machine virtuelle risquerait de manquer de mémoire.

  • Un WeakReference peut être effacé et mis en file d'attente dès qu'est connu pour être faiblement référencé.

 20
Author: Muhammad Nabeel Arif, 2015-04-06 13:16:48

Les trois termes que vous avez utilisés sont principalement liés à l'admissibilité de l'objet à la collecte des ordures .

Référence Faible :: c'est une référence qui n'est pas assez forte pour obliger l'objet reste dans la mémoire . C'est le caprices du garbage collector pour collecter cet objet pour la collecte des ordures. Vous ne pouvez pas forcer ce GC à ne pas le collecter.

Soft Reference :: C'est plus ou moins la même chose que la référence faible . Mais vous pouvez dire que cela tient l'objet un peu plus fortement que la référence faible de garbage collection.

Si les Garbage collectors collectent la référence faible dans le premier cycle de vie lui-même, il collectera la référence douce dans le prochain cycle de collecte des ordures.

Strong Reference :: C'est juste à l'opposé des deux types de références ci-dessus . Ils sont moins comme pour obtenir des ordures collectées (la plupart du temps, ils ne sont jamais collectés.)

Vous pouvez vous référer au lien suivant pour plus d'informations :

Http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ref/Reference.html

 14
Author: Sabya, 2012-03-21 17:07:42

4 degrés de référence - Strong, Weak, Soft, Phantom

Strong-est une sorte de référence, ce qui rend l'objet référencé non admissible pour le GC. classes de constructeur. eg-StringBuilder

Faible - est une référence qui est admissible au GC.

Soft - est une sorte de référence dont l'objet est éligible pour GC jusqu'à ce que la mémoire soit disponible. Idéal pour le cache d'image. Il les tiendra jusqu'à ce que la mémoire soit disponible.

Phantom - est une sorte de référence, dont l'objet est directement admissible pour le GC. Utilisé uniquement pour savoir quand un objet est supprimé de la mémoire.

Utilise:

  1. Vous permet d'identifier quand un objet est exactement retiré de la mémoire.

  2. Lorsque la méthode finalize() est surchargée, le GC peut ne pas se produire en temps opportun pour les objets éligibles au GC des deux classes. Donc, la référence fantôme les rend éligibles pour GC avant finalize(), c'est pourquoi vous pouvez obtenir OutOfMemoryErrors même lorsque la plupart du tas est ordures.

Les références faibles sont idéales pour implémenter les modules de cache.

 8
Author: Preetham R U, 2017-10-28 11:53:00

Références fortes

Ce sont vos références d'objet régulières que nous codons quotidiennement:

Employee emp = new Employee();

La variable "emp" contient une référence forte à un objet Employé et les objets accessibles via n'importe quelle chaîne de références fortes ne sont pas admissibles à la récupération de place. Généralement, c'est ce que vous voulez, mais pas toujours. Supposons maintenant que nous récupérions beaucoup d'employés de la base de données dans une collection ou une carte, et nous devons faire beaucoup de traitement sur eux régulièrement, donc dans l'ordre garder performance nous allons les garder dans le cache.

Dans la mesure où c'est bon, mais maintenant nous avons besoin de données différentes et nous n'avons pas besoin de ces objets employés et ceux-ci ne sont référencés nulle part sauf le cache. Ce qui provoque une fuite de mémoire car ces objets ne sont pas utilisés mais ne sont toujours pas éligibles à la récupération de place et nous ne pouvons pas supprimer ces objets du cache car nous n'avons pas de référence à eux? Donc ici soit nous devons vider tout le cache manuellement ce qui est fastidieux soit nous pourrait utiliser d'autres références aimables, par exemple des références faibles.

Références faibles

Une référence faible n'épingle pas un objet en mémoire et sera GC'd dans le prochain cycle GC si elle n'est pas référencée à partir d'autres références. Nous pouvons utiliser la classe WeakReference qui est fournie par Java pour créer des types de caches ci-dessus, qui ne stockeront pas d'objets qui ne sont pas référencés ailleurs.

WeakReference<Cache> cache = new WeakReference<Cache>(data);

Pour accéder aux données, vous devez appeler cache.obtenir(). Cet appel à get peut renvoyer null si le faible la référence a été récupérée: vous devez vérifier la valeur renvoyée pour éviter les NPE. Java fournit des collections qui utilisent des références faibles, par exemple, la classe WeakHashMap stocke les clés (pas les valeurs) en tant que références faibles. Si la clé est GC'd, la valeur sera automatiquement supprimée de la carte.

Puisque les références faibles sont aussi des objets, nous avons besoin d'un moyen de les nettoyer (elles ne sont plus utiles lorsque l'objet qu'elles référencaient a été GC'd). Si vous passez une ReferenceQueue dans le constructeur pour une référence faible, le garbage collector ajoutera cette référence faible à la ReferenceQueue avant qu'elles ne soient finalisées ou GC'd. Vous pouvez traiter périodiquement cette file d'attente et traiter les références mortes.

Références douces

Une SoftReference est comme une WeakReference mais elle est moins susceptible d'être récupérée. Les références logicielles sont effacées à la discrétion du garbage collector en réponse à la demande de mémoire. La machine virtuelle garantit que toutes les références douces à doucement les objets accessibles auront été effacés avant de lancer une OutOfMemoryError.

Références fantômes

Les références fantômes sont les plus faibles de tous les types de référence, appeler get sur eux renverra toujours null. Un objet est référencé de manière fantomatique après avoir été finalisé, mais avant que sa mémoire allouée ait été récupérée, par opposition aux références faibles qui sont mises en file d'attente avant d'être finalisées ou les références fantômes GC'd sont rarement utilisées.

Alors comment sont-ils utile? Lorsque vous construisez une référence fantôme, vous devez toujours passer une ReferenceQueue. Cela indique que vous pouvez utiliser une référence fantôme pour voir quand votre objet est GC'd.

Hey, donc si les références faibles sont mises en file d'attente lorsqu'elles sont considérées comme finalisées mais pas encore GC'd, nous pourrions créer une nouvelle référence forte à l'objet dans le bloc finalizer et empêcher l'objet d'être GC'd. Oui, vous pouvez mais vous ne devriez probablement pas le faire. Pour vérifier ce cas le cycle GC se produira au moins deux fois pour chaque objet, sauf si cet objet n'est accessible que par une référence fantôme. C'est pourquoi vous pouvez manquer de tas même lorsque votre mémoire contient beaucoup de déchets. Les références fantômes peuvent empêcher cela.

 3
Author: Naresh Joshi, 2018-03-20 07:39:59