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()函数里自救的对象(没有与引用莲重新连接上)。
相关文章推荐
- jvm垃圾回收-标记复制
- jvm垃圾回收算法(并发垃圾收集器(CMS)为什么没有采用标记整理-算法来实现,而是采用的标记-清除算法?)
- JVM垃圾收集器----垃圾标记、回收算法
- jvm:停止复制、标记清除、标记整理算法(垃圾回收)
- JVM详解之Java垃圾回收机制详解和调优
- JVM垃圾回收
- JVM常用垃圾回收算法总结
- JVM的垃圾回收机制详解和调优
- JVM调优总结(4):分代垃圾回收
- jvm垃圾回收以及内存分配相关知识
- JVM内存模型以及垃圾回收
- jvm 之 垃圾标记算法
- 深入理解JVM--JVM垃圾回收机制
- JVM 垃圾回收算法
- JVM学习笔记-内存管理及垃圾回收
- jvm 垃圾回收算法
- jvm关于内存管理和垃圾回收的学习总结
- JVM垃圾回收机制
- android Jvm 笔记。内存溢出。内存区域划分。垃圾回收气
- JVM调优总结-分代垃圾回收详述2