JVM - 9:什么情况下JVM内存中的一个对象会被垃圾回收

12 篇文章 2 订阅
什么时候会触发垃圾回收

在之前说到,当对象没人引用

导致新生代的内存占用越来越多,都快满了

这个时候,就会触发垃圾回收

被那些变量的引用的不能被回收

只要你的对象被方法的局部变量,类的静态变量给引用了就不会回收他们

JVM使用了一种可达性分析算法

用来分析对象被谁引用了

在JVM规范中,局部变量就是一个GC Roots

Java中不同的引用类型

强引用
只要是强引用,引用的类型,垃圾回收器,是不会回收这个对象的
在这里插入图片描述

软引用
正常情况下垃圾回收是不会碰这样的对象的
但是当垃圾回收之后,发现还是不足以存放新对象
才会把软引用回收掉
那怕被变量引用了
在这里插入图片描述

弱引用
如果发生垃圾回收,就会把这种给回收掉
在这里插入图片描述

虚引用
很少用

finalize()方法

有GC Roots引用的对象不能回收,没有GC Roots引用的对象可以回收,

如果有GC Roots引用,但是如果是软引用或者弱引用的,也有可能被回收掉。

假设没有GC Roots引用的对象,是一定立马被回收吗

其实不是的,这里有一个finalize()方法可以拯救他自己

在这里插入图片描述

假设有一个ReplicaManager对象要被垃圾回收了,那么假如这个对象重写了Object类中的finialize()方法

此时会先尝试调用一下他的finalize()方法,看是否把自己这个实例对象给了某个GC Roots变量,比如说代码中就给了ReplicaManager类的静态变量。

如果重新让某个GC Roots变量引用了自己,那么就不用被垃圾回收了。

很少使用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值