当对象存在引用时,是否可能在系统触发GC时会被回收?

    技术2022-07-12  72

    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的关系就说到这里,希望能给你们一些帮助,如果有什么错误请指正,感谢!!!

    Processed: 0.009, SQL: 9