美文网首页
对象生与死的判定

对象生与死的判定

作者: kindol | 来源:发表于2018-07-10 22:02 被阅读0次

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

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

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

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

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

    • 废弃常量

      判定:没有地方引用则为废弃,跟上面的一致。举个例子:“abc”常量,若无引用且有必要时,将被清理出常量池。常量池中其他接口、方法、符号引用同理

    • 无用的类

      判定:满足以下三个条件

      1. 无任何实例
      2. 加载该类的ClassLoader已被回收
      3. 对应Class对象无任何引用

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

    相关文章

      网友评论

          本文标题:对象生与死的判定

          本文链接:https://www.haomeiwen.com/subject/moaqpftx.html