JVM如何判断对象已“死”(可达性分析算法)

Java垃圾回收器通过可达性分析算法判断对象是否存活,考虑GC Roots可达性。引用计数法因循环引用问题未被采用。Java 1.2后引入强、软、弱、虚引用。覆写finalize()方法的对象可在回收前获得一次复活机会。方法区的垃圾回收关注废弃常量和无用类。
摘要由CSDN通过智能技术生成

Java堆上存放着几乎所有对象实例,垃圾回收器在对堆进行垃圾回收前需要判断哪些对象还存活?哪些对象已经“死去”(不再被引用)?

除了可达性分析算法外还有引用计数法。

引用计数法

例:
A对象引用了B对象,给B对象的计数器+1
C对象也引用了B对象,给B对象的计数器再+1
当引用失效时,计数器-1
任何时刻计数器为0的对象就是不能再被使用的,即对象已“死”,才可以被回收。

这就是引用计数法

虽然引用计数法实现简单,判断效率也高,但JVM中没有选用引用计数法来管理内存,主要是因为引用计数法无法解决对象的循环引用问题
在这里插入图片描述
A和B的计数器都是1,不能被回收。

Python语言采用的就是引用计数法来进行内存管理。

可达性分析算法

JVM采用的是“可达性分析”来判断对象是否存活。
在这里插入图片描述
object5、object6、object7之所以被回收,是因为它们不能到达GC Roots(不可达),所以已“死”,被回收。

在Java中,可以作为GC Roots的对象有以下几种:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值