请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

正在回答 回答被采纳积分+3

1回答

翔仔 2019-10-18 22:17:30

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

0 回复 有任何疑惑可以回复我~
  • 提问者 厥~~~ #1
    老师我的意思是,如果没有覆盖finalize方法或者finalize方法已经执行过了,就根本不会有第二次标记。但是书上说的每个对象回收时候至少有两次标记。但是实际上有时候一次标记就直接被GC回收了。一次和至少两次有矛盾。
    回复 有任何疑惑可以回复我~ 2019-10-18 22:22:02
  • 翔仔 回复 提问者 厥~~~ #2
    同学好,我只讨论的是finalize后再标记的原因,都需要经历二次标记呀,不管是否覆盖了finalize()方法
    回复 有任何疑惑可以回复我~ 2019-10-18 22:55:20
  • 提问者 厥~~~ 回复 翔仔 #3
    老师我是看这个CSDN的帖子。https://bbs.csdn.net/topics/392309703
    感觉如果没有覆盖finalize方法是没有必要执行第二次小规模标记的。
    回复 有任何疑惑可以回复我~ 2019-10-18 23:33:06
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信