JVM——finalize()方法之对象存活最后的机会

本文详细解析了Java中对象被垃圾回收的过程,包括可达性分析法、finalize()方法的作用及其实现机制,以及如何避免使用finalize()方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存中的对象要被回收至少要经过两次标记才能被回收掉。

        我们说过可达性分析法来判断一个对象是否还会被引用,此时即使该对象已经没有任何引用链了,但是该对象也不一定会被回收,这样的对象需要先进行一步筛选,而又不是所有处于该状态的对象都会经过筛选,进行筛选的条件是该对象是否有必要执行finalize()方法,如果该对象没有覆盖finalize()方法或者虚拟机已经执行过该对象的finalize()方法,此时虚拟机会认为该对象没有必要执行finalize()方法,会将该对象直接回收掉。

        如果判断该对象有必要执行finalize()方法,将该对象放入一个叫做F-Queue的队列中,并且在稍后通过一个由虚拟机创建的低优先级的线程去执行它,即虚拟机去触发finalize()方法,并且虚拟机不会等待他执行结束。执行finalize()方法是该对象最后一次自救的机会,只要在finalize时将自己与引用链上的人也一个节点建立连接即可,这样就会被回收,否则在执行完finalize方法之后,GC垃圾回收器就会将F-Queue队列中的对象进行小规模的标记,然后回收掉。如果对象与任何一个节点建立了联系,就将自己移出了待回收的队伍。

    (注意:之所以建立一个低优先级的线程去触发该方法,是因为finalize方法容易造成内存系统崩溃,一旦线程执行过慢或者发生死循环,F-Queue队列中的其他对象就会进入永久等待状态,甚至造成整个内存回收系统的崩溃。)


建议不要使用finalize方法,finalize方法过于危险,他的作用用其他代码同样可实现的更好。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值