为啥至少要两次标记才能回收。感觉这里矛盾。

来源:7-5 Java垃圾回收之常见面试题

厥~~~

2019-10-18

覆盖了finalize()的对象并且没有执行finalize()方法的才会被放入F-Queue中并进行第二次标记,至于那些没有覆盖finalize()方法或者已经执行完这个方法还是需要被回收的只标记一次就可以回收了。
虽然书上说的:要宣布一个对象死亡至少要经历两次标记过程。
但是有时候第一次标记后就可以直接GC回收了啊。第二次标记完全不需要。

写回答

1回答

翔仔

2019-10-18

同学好,我理解应该是语言设计者给对象一次复活的机会,类似加入了一个勾子,这个勾子就是finalize() 在里面可能会让对象"复活",给业务多一次选择机会,虽然我没遇到过这种需求,但是不保证其他的没这样的一些奇怪的需求,所以既然开了口子了,就得给一个二次标记的机会来回收对象,防止内存溢出

0
4
翔仔
回复
厥~~~
同学好,不好意思,昨晚加班太晚,看错了,我以为是CMS的二次标记了,这个的话应该是没有覆盖finalize的话就会只标记一次,标记两次的话,站在我们自己设计的程序的角度来讲,也是没有必要的:)
2019-10-19
共4条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8442 学习 · 1872 问题

查看课程