java判断一个对象是否存活

前言

众所周知,在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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值