对象生与死的判定

2018-07-10  本文已影响0人  kindol

对象的生与死,也就是决定是否被回收,不仅仅由单一的引用计数法或者GC Roots算法决定其生死,由于引用计数法现较少用,所以只考虑GC Roots的情况。

即便在GC Roots可达性分析后发现对象是不可达对象,也不是在之后的垃圾回收就立即会被收集,要宣告一个对象真正死亡,至少经历两次标记过程。以下详细讨论:

  1. 在可达性分析后发现没有和GC Roots相连接的引用链,那么它将会被第一次标记并且进行一次筛选。筛选的标准是对象是否有必要执行finalize()方法,若对象无覆盖finalize()或者finalize()已经被调用过,jvm将任务没有必要执行,直接进入“即将回收”的集合等待第二次标记。
  2. 若对象被认为有必要执行finalize(),对象将会被放置到一个队列中,稍后由jvm内部的低优先级的Finalizer线程去触发此方法,但jvm不承诺等待它运行结束,因为队列中还有其他对象需要触发,而此时执行的finalize可能死循环,若等待可能导致垃圾回收系统崩溃。
  3. finalize()是对象逃离回收命运的最后一次机会(这种自救机会只有一次),稍后GC将对队列中的对象进行第二次小规模的标记,若对象在finalize时重新与引用链上任一对形象建立关联,那么对象将在第二次标记的时候被移出“即将回收”的集合。

当然了,对于方法区的回收比较特殊,方法区的垃圾收集效率是比较低的。

方法区的垃圾主要回收两部分内容:废弃常量、无用的类

参考:
《深入理解java虚拟机》

上一篇下一篇

猜你喜欢

热点阅读