java finalize() 调用机制

本文探讨了JVM中finalize方法的调用机制,解析了对象如何仅在经历一次GC后调用一次finalize,揭示了其背后的标记状态与可达状态空间概念,以及如何确保对象复用finalize方法时,只被调用一次。

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

抱着深究细节的心态,重看<<深入理解jvm虚拟机>>的时候,记录遇到的困惑的答案.

一.finalize 只被调用一次的实现机制

jvm gc的机制是  不管有没有调用System.gc(),jvm都是去计算安全点进行gc()。然后触发gc的时候,会调用一次finalize(),此时,对象可以进行自救,如果自救失败,对象被回收,同时,第二次gc不会再触发finalize()方法。所以,严格的对象回收定义是:

从GC Roots搜索不到,而且经历过一次标记清理之后仍然没有复活的对象。

那么,我产生了一个疑问,jvm如何实现对复用了finalize()方法的对象,gc时,只调用一次finalize()方法

猜测:

  • 标记位 (感觉消耗挺大的,即使一个对象一个bit,几百万的对象也占用不小空间,而且,这个标记位必须绑定在对象上,而不是class文件中)
  • 判断状态除了标记位还有别的办法吗?有知道的请务必告诉我。

经过一番搜索,找到了答案  java的finalize()函数

大概意思就是状态标记(就是标记位) 

每个对象包括两种标记

  • 一是终结状态空间 F = {unfinalized, finalizable, finalized};

  • 二是可达状态空间 R = {reachable, finalizer-reachable, unreachable}

通过触发事件,修改状态达到只触发一次finalize()方法的功能。具体可以看上面的博文。我这里就只转发一下了,就不重复借鉴了。

再贴一遍地址   java的finalize()函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值