参考https://blog.csdn.net/u011936381/article/details/11709245
一、强引用:
对象的引用被至少一个变量所把持,此时该对象引用就是强引用,jvm无论怎么样都不会回收强引用,除非再也没有任何变量继续把持该引用。
二、软引用、弱引用、虚引用的使用都需要配合SoftReference、WeekReference、PhantomReference才能使用。
这三者的概念:
软引用:当内存不足时才会回收,其他情况下不会回收。
弱引用:当垃圾回收期检测到弱引用时会回收,没检测到则不会回收。
虚引用:随时会回收,一般用于判断虚拟机回收情况,而且必须与引用队列一起用,否则没效果,前面两种可以不与引用队列一起用(最好还是一起用)。
三者使用方式差不多,这里只介绍一种,比如软引用:
MyObject aRef = new MyObject();
SoftReference aSoftRef = new SoftReference(aRef);
在这个时候,aRef变量还拿着MyObjet对象的引用,此时这引用是强引用,同时该引用还传给了SoftReference 的对象aSoftRef
接着执行 aRef =null;
此时aRef变量没有再把持该引用了,这个时候该对象引用被SoftReference对象aSoftRef 把持着,那就是软引用。
这个时候MyObjet对象的引用只有当内存不足时才会被垃圾回收器回收。
另外两种引用使用方式与这差不多。
三、引用队列
作为一个Java对象,SoftReference对象除了具有保存软引用的特殊性之外,也具有Java对象的一般性。所以,当软可及对象被回收之后,虽然这个SoftReference对象的get()方法返回null,但这个SoftReference对象已经不再具有存在的价值,需要一个适当的清除机制,避免大量SoftReference对象带来的内存泄漏。在java.lang.ref包里还提供了ReferenceQueue。如果在创建SoftReference对象的时候,使用了一个ReferenceQueue对象作为参数提供给SoftReference的构造方法,如:
ReferenceQueue queue = new ReferenceQueue();
SoftReference ref = new
SoftReference(aMyObject, queue);
那么当这个SoftReference所软引用的aMyOhject被垃圾收集器回收的同时,ref所强引用的SoftReference对象被列入ReferenceQueue。也就是说,ReferenceQueue中保存的对象是Reference对象,而且是已经失去了它所软引用的对象的Reference对象。另外从ReferenceQueue这个名字也可以看出,它是一个队列,当我们调用它的poll()方法的时候,如果这个队列中不是空队列,那么将返回队列前面的那个Reference对象。
在任何时候,我们都可以调用ReferenceQueue的poll()方法来检查是否有它所关心的非强可及对象被回收。如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象。利用这个方法,我们可以检查哪个SoftReference所软引用的对象已经被回收。于是我们可以把这些失去所软引用的对象的SoftReference对象清除掉。常用的方式为:
SoftReference ref = null;
while ((ref = (EmployeeRef) q.poll()) != null) {
// 清除ref
}