《深入理解Java虚拟机(第3版)- 对象缓刑》

当Java对象失去GC Roots引用,不会立即回收,会经历标记、可能的finalize()执行过程。如果对象覆盖finalize()并能在此方法中自救,如重新关联引用链,将逃脱第一次回收。然而,即使自救成功,若再次被 GC,finalize()将不再执行,对象最终会被回收。
摘要由CSDN通过智能技术生成

当一个对象脱离了GC Roots引用链,并不是马上就被回收的。会经历如下阶段:

1,该对象脱离GC Roots引用链,进行第一次标记。

2,判断该对象是否覆盖finalize()方法,如果没有,则真的就要被回收了。

如果该对象覆盖了覆盖finalize()方法,对象将会被放置在一个名为F-Queue的队列之中,并在稍后由一条由虚拟机自动建立的、低调度优先级的Finalizer线程去执行它们的finalize()方法。这里所说的“执行”是指虚拟机会触发这个方法开始运行,但并不承诺一定会等待它运行结束。这样做的原因是,如果某个对象的finalize()方法执行缓慢,或者更极端地发生了死循环,将很可能导致F-Queue队列中的其他对象永久处于等待,甚至导致整个内存回收子系统的崩溃。

一次性的免死金牌:

如果对象要在finalize()中成功拯救自己——只要重新与引用链上的任何一个对象建立关联即可,譬如把自己(this关键字)赋值给某个类变量或者对象的成员变量,那在第二次标记时它将被移出“即将回收”的集合。

注意 finalize()只会被执行一次,所以如果对象在第一次GC回收时,通过finalize()给自己续命了一次,但是很不幸,程序继续运行时,该对象再次脱离GC roots引用链了,在被标记为回收时,就不会再执行这个finalize()方法了,也就是死的翘翘的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值