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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值