前言
众所周知,在java中一个对象如果死掉很快就会被垃圾回收机制处理了,但是怎么判断一个对象是否存活呢,这次就来记录学习一下
方法
主要有两个方法
1.引用计数法(已弃用)
原理:给java对象添加一个引用计数器,当被引用一次+1,引用失效-1,当计数器为0时则判定该对象死亡
缺点:遇见两个对象相互引用的情况则失效
2.引用链法(可达性分析法)
步骤:
<1.可达性分析
<2.第一次标记 & 筛选
<3.第二次标记 & 筛选
详解:
<1.可达性分析
找寻一个可以作为GC root的对象作为起点,从该起点向下搜索,当该对象没有任何引用链相连时,则判定该对象不可达
可以作为GC root的有:虚拟机栈中的对象、本地方法栈的jni对象、方法区的静态成员
不可达仅判定该对象不可达,还不能判定该对象是否失效
<2.第一次标记 & 筛选
当判定一个对象为不可达时,会将该对象放在即将回收的集合中,然后进行第一次标记筛选
筛选:如果该对象没有finalize()方法或已经执行过了,则判定该对象已经失效;若有finalize()方法且未执行过则进行第二次标记筛选
<3.第二次标记 & 筛选
在上一轮筛选结果中,放到一个 F-Queue 队列中,并由虚拟机自动建立、优先级低的Finalizer 线程去执行 队列中该对象的finalize(),在执行finalize()过程中,若对象依然没与引用链上的GC Roots 直接关联或间接关联,那么该对象将被判断死亡等待回收
finalize()只会被执行一次
参考
https://www.jianshu.com/p/108ddab3ad3f