Whether it is to determine the number of references to an object through a counting algorithm, or to determine whether the object reference chain is reachable through a root search algorithm, determining whether an object is alive is related to "references".
References are mainly divided into four types: Strong Reference, Soft Reference, Weak Reference, and Phantom Reference. The strength of the reference decreases sharply in turn.
refers to what is common in the code, similar to: "Object objectRef = new Object", this kind of reference will never be cleaned up by GC as long as the strong reference still exists.
is used to describe some objects that are useful but do not necessarily exist. When the Jvm is out of memory (before memory overflow ) will be recycled. If there is still not enough space after executing GC, a memory overflow exception will be thrown.
Soft references are implemented through the SoftReference class. SoftReference is very suitable for implementing caching. In addition, when the GC believes that the scanned SoftReference is not frequently used, it may be recycled.
Usage:
##
User user = new User(); SoftReference<Object> softReference = new SoftReference<Object>(user); softReference.get();
Weak reference is also used Describes some objects that are useful but do not necessarily exist. Their strength will be weaker due to soft references. Objects associated with weak references can only survive until the next GC. When the GC works, it will be recycled regardless of whether the memory is sufficient. Drop objects associated with weak references. JDK implements this through the WeakReference class. When obtained, it can be obtained through the weakReference.get method, which may return nullYou can pass in a ReferenceQueue object to the WeakReference construct. When the reference object is represented as recyclable, isEnqueued returns true
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 reference is called "phantom reference" and it is the weakest A reference relationship, whether an object has a virtual reference, will not affect the survival time at all. The only purpose of setting a virtual reference association for an object is to receive a system notification when the object is recycled by GC. Implemented through the PhantomReference class. It is worth noting that the phantomReference.get method always returns null. When the user is deleted from the memory, calling isEnqueued will return 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();
The above is the content of Java virtual machine learning - object reference strength. For more related content, please pay attention to the PHP Chinese website (www.php.cn)!