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

对象生与死的判定

作者: 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虚拟机》

相关文章

  • 对象生与死的判定

    对象的生与死,也就是决定是否被回收,不仅仅由单一的引用计数法或者GC Roots算法决定其生死,由于引用计数法现较...

  • 对象存活判定算法(可回收对象的判定)

    概述 程序计数器、虚拟机栈、本地方法栈这些区域不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着...

  • Java垃圾回收机制

    对象被判定为垃圾:没有被其他对象引用 一、判定对象是否为垃圾的算法 引用计数算法判断对象的引用数量 通过判断对象的...

  • is 和 ==

    'is'是判定是否是同一个对象'=='判定值是否相等

  • GC

    垃圾回收标记算法 对象被判定为垃圾的标准 没有被其他对象引用 判定对象是否为垃圾的算法 引用计数算法 可达性分析算...

  • Java虚拟机内存管理——内存管理

    可回收对象判定算法 可回收对象的判定算法,即判断哪些对象是可以被回收,目前主流的语言一般有以下两种:(1)引用记数...

  • Java虚拟机垃圾收集算法实现

    垃圾收集算法实现 垃圾收集算法实现必须考虑运行效率。 对象存活判定算法实现 对象存活判定算法都使用可达性分析算法实...

  • GC相关

    一 对象被判定为垃圾的标准是什么?  1. 没有任何引用的时候; 二 判定对象是否为垃圾的算法.  1. 引用计数...

  • 浅谈Java对象的生与死

    Java对象在JVM中如何分配?分配在哪个地方?Java有自动内存管理机制,那它是怎么判定一个对象是垃圾对象的?以...

  • CG

    1.对象怎么判定已死: 1.对象引用计数法每个对象都有一个引用计数器,当引用计数器归零时,即可判定对象已死。但是在...

网友评论

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

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