您的位置:首页 > 编程语言 > Java开发

JVM垃圾回收的二次标记

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


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

在这里只需要知道,GC会二次标记,第一次标记,标记没有重写finalize()函数遮着没有必要执行finalize()函数的对象(已经执行过),第二次标记F_Queue中没有在 finalize()函数里自救的对象(没有与引用莲重新连接上)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息