Qu'il s'agisse de déterminer le nombre de références à un objet grâce à un algorithme de comptage, ou de déterminer si la chaîne de référence d'objet est accessible grâce à un algorithme de recherche de racine, déterminer si un objet est vivant est lié aux "références ".
Les références sont principalement divisées en quatre types : référence forte, référence douce, référence faible et référence fantôme. La force de la référence diminue fortement dans l'ordre.
fait référence à quelque chose d'omniprésent dans le code, similaire à : "Object objectRef = new Object", ce type de référence ne sera jamais nettoyé par GC tant que la référence forte existe toujours.
est utilisé pour décrire certains objets qui sont utiles mais n'existent pas nécessairement lorsque la Jvm manque de mémoire (. avant le débordement de mémoire) sera recyclé S'il n'y a toujours pas assez d'espace après l'exécution de GC, une exception de débordement de mémoire sera levée.
Les références logicielles sont implémentées via la classe SoftReference. SoftReference est très approprié pour implémenter la mise en cache. De plus, lorsque le GC estime que le SoftReference numérisé n’est pas fréquemment utilisé, il peut être recyclé.
Utilisation :
User user = new User(); SoftReference<Object> softReference = new SoftReference<Object>(user); softReference.get();
Il en va de même pour référence faible Utilisé pour décrire certains objets qui sont utiles mais qui n'existent pas nécessairement. Sa force sera plus faible que celle des références logicielles. Les objets associés à des références faibles ne peuvent survivre que jusqu'au prochain GC, que la mémoire fonctionne ou non. est suffisant, les objets associés aux références faibles seront recyclés. JDK implémente cela via la classe WeakReference.
Une fois obtenu, il peut être obtenu via la méthode lowReference.get, qui peut renvoyer null
Vous pouvez transmettre un objet ReferenceQueue au constructeur WeakReference Lorsque l'objet de référence est représenté comme recyclable, isEnqueued renvoie vrai
User user = new User(); WeakReference<User> weakReference = new WeakReference<User>(user); weakReference.get(); ReferenceQueue<User> referenceQueue = new ReferenceQueue<User>(); WeakReference<User> weakReference2 = new WeakReference<User>(user, referenceQueue); //当引用对象被标识为可回收时 返回true, 即当user对象标识为可回收时,返回true weakReference.isEnqueued();
La référence factice est appelée "référence fantôme", c'est la relation de référence la plus faible. Le fait qu'un objet ait une référence virtuelle n'affectera pas du tout le temps de survie. Le seul but de la définition d’une association de référence virtuelle pour un objet est de recevoir une notification système lorsque l’objet est recyclé par le GC. Implémenté via la classe PhantomReference.
Il convient de noter que la méthode phantomReference.get renvoie toujours null Lorsque l'utilisateur est supprimé de la mémoire, l'appel à isEnqueued retournera true
User user = new User(); ReferenceQueue<User> referenceQueue = new ReferenceQueue<User>(); PhantomReference<User> phantomReference = new PhantomReference<User>(user, referenceQueue); //即当user对象标识为可回收时,返回true System.out.println(phantomReference.isEnqueued()); //永远返回null System.out.println(phantomReference.get());
WeakCache weakCache = new WeakCache(); SoftCache softCache = new SoftCache(); WeakHashMap weakHashMap = new WeakHashMap();
Lorsque le mécanisme de collecte des ordures est en cours d'exécution, analysez la relation de référence, GC traitera ces trois types de références différemment, en termes simples, GC déterminera d'abord si la référence analysée est un type de référence et si l'objet auquel il fait référence n'a pas de référence forte. , L'objet est considéré comme étant du type Référence correspondant. Plus tard, lors du garbage collection, ces objets seront traités en conséquence en fonction des différents types Référence.Ce qui précède est le contenu de l'apprentissage de la machine virtuelle Java - force de référence d'objet Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !