这里先引用一篇文章
https://www.cnblogs.com/wjh123/p/11142176.html
强引用:键字new创建的对象所关联的引用就是强引用。只要还存在引用关系,gc就不会随意回收对象。如下图
public class StrongReference {
public static void main(String[] args) {
Object o = new Object();
System.gc();
System.out.println(o.toString());
}
}
通过测试发现在有强引用关系时,就算调用gc回收,对象还是依旧存在的。
如果代码修改成
public class StrongReference {
public static void main(String[] args) {
Object o = new Object();
System.gc();
o = null ;
System.out.println(o.toString());
}
}
测试发现会报空指针
软引用:通过SoftReference类实现。
软引用的生命周期比强引用短一些可以把软引用的对象理解为把对象"缓存"起来 在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常
弱引用:弱引用通过WeakReference类实现。 ThreadLocal 里面的Entry就使用了弱引用
弱引用的生命周期比软引用短。垃圾回收时,如果这个对象只被弱引用关联(没有任何强引用关联他),无论内存是否足够,这个对象都会被回收。
虚引用:通过PhantomReference类来实现,用来管理堆外内存。当gc准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中,如下图。程序通过判断queue中是否存在该虚引用,如果存在,垃圾回收器就可以对堆外内存的对象进行回收。