对象finalize机制

finalize()是Object类的,该方法是垃圾回收机制回去调用的,java对象不要试图调用

1、finalize()可能导致对象复活

2、finalize()执行的时间没有保障,它是由GC线程决定的,如果没有GC,则finalize()方法将没有执行机会。

3、复写finalize()方法,有可能对GC性能造成影响

如果从所有根节点都无法访问到某个对象,说明该对象已经不再使用,一般来说,此对象需要被回收。但事实上,有可能处于“死缓”状态,一个无法触及的对象有可能在某一个条件下复活自己。

一、对象的三种状态

finalize()方法的存在,虚拟机中对象一般处于三种可能的状态

1、可触及

从根节点开始,可以达到这个对象

2、可复活

对象的所有引用都被释放,但是对象有可能在finalize()方法中复活

3、不可触及(GC会回收)

对象的finalize方法被调用,并且没有复活,那么就会进入不可触及的状态。不可触及的对象不可能被复活,因为finalize只能被调用一次。

二、判定对象回收过程

判定一个对象是否可以回收,至少需要经历两次标记过程

1、如果对象objA到GC Roots没有引用链,则进行第一次标记

2、进行筛选,判断该对象是否有必要执行finalize方法

(1)如果对象objA没有重写finalize方法,或者finalize已经被虚拟机调用过,则虚拟机视为“没有必要执行”,objA被判定为不可触及

(2)如果对象objA重写了finalize方法,且没有执行过,那么objA会被插入到F-Queue队列中,由一个虚拟机自动创建,低优先级的Finalizer线程触发其finalize方法执行

(3)finalize方法是对象逃逸死亡的最后机会,稍后GC会对F-Queue队列里的对象进行第二次标记,如果objA在finalize方法中与引用链上任何一个对象建立了联系,那么第二次标记时,objA会被移除“即将回收”集合。如果之后,该对象再次出现没有引用链时,该对象的finalize方法不会再执行,对象会直接变成不可触及的状态。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值