java finalize() 调用机制

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/u013501457/article/details/90814898

抱着深究细节的心态,重看<<深入理解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()函数

猜你喜欢

转载自blog.csdn.net/u013501457/article/details/90814898