JVM垃圾回收的二次标记

来源:互联网 发布:js查找字符串出现次数 编辑:程序博客网 时间:2024/06/01 09:28
在根搜索中得到的不可达对象并不是立即就被标记成可回收的,而是先进行一次标记放入F-Queue等待执行对象的finalize()方法,执行后GC将进行二次标记,复活的对象之后将不会被回收。因此,使对象复活的唯一办法就是重写finalize()方法,并使对象重新被引用。

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

0 0
原创粉丝点击