Ob es darum geht, die Anzahl der Verweise auf ein Objekt durch einen Zählalgorithmus zu bestimmen oder um zu bestimmen, ob die Objektreferenzkette durch einen Stammsuchalgorithmus erreichbar ist, hängt die Bestimmung, ob ein Objekt lebendig ist, mit „Referenzen“ zusammen ".
Referenzen werden hauptsächlich in vier Typen unterteilt: Starke Referenz, Weiche Referenz, Schwache Referenz und Phantomreferenz. Die Stärke der Referenz nimmt in der Reihenfolge stark ab.
bezieht sich auf etwas, das im Code allgegenwärtig ist, ähnlich wie: „Objekt objectRef = neues Objekt“ wird diese Art von Referenz niemals von GC bereinigt, solange die starke Referenz noch vorhanden ist.
wird verwendet, um einige Objekte zu beschreiben, die nützlich sind, aber nicht unbedingt vorhanden sind, wenn der JVM nicht über genügend Speicher verfügt (. vor dem Speicherüberlauf) wird recycelt. Wenn nach der Ausführung von GC immer noch nicht genügend Speicherplatz vorhanden ist, wird eine Speicherüberlaufausnahme ausgelöst.
Soft-Referenzen werden über die SoftReference-Klasse implementiert und eignen sich sehr gut für die Implementierung von Caching. Wenn der GC außerdem der Meinung ist, dass die gescannte SoftReference nicht häufig verwendet wird, kann sie recycelt werden.
Verwendung:
User user = new User(); SoftReference<Object> softReference = new SoftReference<Object>(user); softReference.get();
Das Gleiche gilt für Schwache Referenz Wird verwendet, um einige Objekte zu beschreiben, die nützlich sind, aber nicht unbedingt vorhanden sind. Objekte, die mit schwachen Referenzen verbunden sind, können nur bis zum nächsten GC überleben ist ausreichend, Objekte, die mit schwachen Referenzen verknüpft sind, werden recycelt. JDK implementiert dies über die WeakReference-Klasse.
Wenn es abgerufen wird, kann es über die Methode „weakReference.get“ abgerufen werden, die möglicherweise null zurückgibt.
Sie können ein ReferenceQueue-Objekt an den WeakReference-Konstruktor übergeben, wenn das Referenzobjekt als recycelbar dargestellt wird. isEnqueued gibt true zurück
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();
Dummy-Referenz wird „Phantom-Referenz“ genannt, Es ist die schwächste Referenzbeziehung, ob ein Objekt eine virtuelle Referenz hat, hat keinen Einfluss auf die Überlebenszeit. Der einzige Zweck des Festlegens einer virtuellen Referenzzuordnung für ein Objekt besteht darin, eine Systembenachrichtigung zu erhalten, wenn das Objekt vom GC recycelt wird. Implementiert durch die PhantomReference-Klasse.
Es ist erwähnenswert, dass die Methode phantomReference.get immer null zurückgibt. Wenn der Benutzer aus dem Speicher gelöscht wird, gibt der Aufruf von isEnqueued true zurück
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();
Beim Garbage Collection-Mechanismus Wenn die Referenzbeziehung ausgeführt wird, verarbeitet GC diese drei Referenztypen unterschiedlich. Vereinfacht gesagt ermittelt GC zunächst, ob es sich bei der gescannten Referenz um einen Referenztyp handelt und das Objekt, auf das es verweist, keine starke Referenz hat , Das Objekt wird als vom entsprechenden Referenztyp betrachtet. Später, während der Garbage Collection, werden diese Objekte entsprechend den verschiedenen Referenztypen verarbeitet.
Das Obige ist der Inhalt des Java Virtual Machine Learning – Objektreferenzstärke. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!