Finalizer 对象生命周期详解
2020-02-11 11:26:17 3 举报
详细描述了 Finalizer 对象的生命周期
作者其他创作
大纲/内容
② 获取 Finalizer 包装的 原始对象,执行其 finalize 方法。
queue
Finalizer 对象 3
obj3
private static ReferenceQueue<Object> queue = new ReferenceQueue<>();
Finalizer 线程(后台线程)专门执行 finalize 方法的线程:Finalizer.FinalizerThread
referent
指向 Finalizer.queue 属性
Finalizer 对象,包装了它所属的对象 obj,是用 Reference.referent 表示的
其他逻辑,不再本讨论范围
关联的对象
Finalizer 对象生命周期详解:1)在创建对象的时候,如果对象重写了 finalize 方法,jvm会同时创建一个Finalizer对象(Finalizer.register 方法)2)通过调用 Finalizer.add 方法,将所有 Finalizer对象构成一个 unfinalized 链表(Finalizer.unfinalized 对象)3)所有 Finalizer 对象都有一个名为 queue 的成员变量(继承自 Reference 的 queue 属性),指向的都是 Finalizer 类的静态 queue 属性。4)cms gc 执行到 mark 阶段的最后时,会把需要gc的对象加入到Reference的pending list 中5)高级别线程 Reference Handler 处理pending list,把pending list中的对象取出来,放到这个对象所指的Reference Queue中,对于 Finalizer对象来说,这个queue指向Finalizer类的静态Queue。6)Finalizer类有一个专门的线程负责从queue中取对象,并且执行 finalizer 引用的对象的 finalize 函数。整个流程如图 ① ② ③ 所示
remove将对象从链表移除
加入之后,链表是这个样子
cms gc执行到mark阶段的最后时,会把需要gc的对象关联的 Finalizer 对象,加入到Reference的 pending 链表中。
创建对象的时候,如果对象重写了 finalize 方法,jvm 会为其生成一个关联的 Finalizer 对象。
Reference Handler 线程(后台、高优先级)将 对象从 pending 链表中取出,放入 Finalizer 对象的 queue中
Finalizer 对象创建后:将其 queue 属性,指向 Finalizer.queue 属性
执行包装的原始对象的 finalize 方法
Finalizer 对象 2
调用 Finalizer.add 方法,将这个对象,加入Finalizer.unfinalized 链表为什么要加入链表?
调用 Finalizer.register 方法,为 obj 生成一个关联的 Finalizer 对象
Reference 类private static Reference<Object> pending = null
放入 queue
Finalizer 对象 4
jvm 创建对象 obj(重写了 finalize 方法),并为其生成一个关联的 Finalizer 对象,该对象封装了 obj。并将 Finalizer 加入 unfinalized 链表。
unfinalized,从名字就能看出,它是所有 finalize 方法尚未执行的 Finalizer 对象构成的链表。加入链表,其中一个作用是,在 jvm 退出时,会执行这个链表中所有对象的 finalize 方法(Finalizer.runAllFinalizers 方法)。
f.runFinalizer
垃圾回收线程,将需要回收的,且重写了 finalize 方法的对象关联的 Finalizer 对象,放入 pending 队列。Reference Handler 线程,将 Finalizer 对象取出,再放入Finalizer.queue 队列
jvm gccms 垃圾收集器执行到 mark 阶段
将 Finalizer 对象取出
Reference.tryHandlePending
创建对象 obj
将 Finalizer 对象加入 pending 链表
是否重写了 finalize 方法?
Finalizer 线程,从 队列中取出 Finalizer 对象,执行其包装对象(referent 属性)的 finalize 方法。
obj2
obj4
否
Finalizer 类
obj1
是
Reference Handler 线程象
Finalizer 对象 1
jvm
0 条评论
下一页
为你推荐
查看更多