Java中我们可以使用的四种引用方式
-
强引用:此引用引用的对象,生命力最强。(对象不会被GC)
这里先定义一个构造,然后定义一个finalize方法,finalize方法会在对象被回收(GC)之前执行,可以对对象的回收进行监控,
也可以在对象回收之前进行一些资源释放操作。
在这里我们可以看到,c1就是强引用,引用了刚刚new的对象。
强引用引用的对象在引用时不会被GC!!!
只有当c1=null时,此时c1没有了指向的对象,即c1的Container对象不可达,也就是JVM访问不到了。
对象一旦没有被引用,被认为是垃圾,JVM触发GC时,该对象就会被GC回收起来。
结果如下图,finalize()方法执行了,即说明对象被手动GC...
-
软引用:此引用引用的对象,在内存不足时可能会被GC。
软引用对应的类是SoftReference。
对于软引用,我们可以采用自动GC的策略来测试该引用类型。
Case1:当内存够用时,软引用类型的对象不会被GC。
我们的测试结果如下,我们可以看到此时并没有打印出finalize()方法的语句,所以说明在JVM自动触发GC的时候,
该软引用引用的对象,并没有被GC回收。即内存充足时,软引用引用的对象是不会被GC掉的。
Case2:当内存不足或吃紧时,软引用类型的对象会被GC。
我们可以看到,当我们要的足够大时,会导致内存不足,此时不断进行GC操作,软引用引用的对象也会被GC回收掉,
我们可以看到finalize()方法中打印了该方法中的语句,即证实了这一结论。
-
弱引用:此引用引用的对象,在GC执行时可能会被销毁(即便是内存充足)。
弱引用对应的类是WeakReference。
对于弱引用,我们可以采用自动GC的策略来测试该引用类型。
我们可以看到,在弱引用引用对象的过程中,在内存充足的时候,通过自动GC就可以把对象给回收掉。
-
虚引用:用的最少,类似没有引用,主要记录对象的销毁。
关于虚引用,类似于没有引用,在这里就不做过多的论述。
说明:软引用和弱引用通常会应用在一些缓存产品的设计中。
关于JVM里的GC机制,大家想深入了解的话,可以关注下面这个网址。https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
四大引用和JVM里的GC的关系就说到这里,希望能给你们一些帮助,如果有什么错误请指正,感谢!!!