JVM垃圾回收的二次标记

在根搜索中得到的不可达对象并不是立即就被标记成可回收的,而是先进行一次标记放入F-Queue等待执行对象的finalize()方法,执行后GC将进行二次标记,复活的对象之后将不会被回收。因此,使对象复活的唯一办法就是重写finalize()方法,并使对象重新被引用。

上面是引用了一篇博客里面的话,基本上和《深入理解java虚拟机》里面‘对象的生存和死亡中’提到的内容差不多,有一点,finalize()只会执行一次,而且JVM不保证该函数的顺利执行完毕,因为如果该函数的操作比较复杂或者出现异常死循环之类的,会导致整个GC程序的崩溃,并不能实现C++中析构函数那样的功能,从书本上和网上的建议都是不要在这个函数里面做过多的操作,善于使用try–catch–finally块。
在这里只需要知道,GC会二次标记,第一次标记,标记没有重写finalize()函数遮着没有必要执行finalize()函数的对象(已经执行过),第二次标记F_Queue中没有在 finalize()函数里自救的对象(没有与引用莲重新连接上)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值