Object类中finalize()方法的澄清说明

4

如果有人能够明确解释Object类中finalize()方法的两个javadoc点,那将非常有帮助:

1. It is guaranteed, however, that the thread that invokes finalize will not be holding any user-visible synchronization locks when finalize is invoked.

“用户可见同步”有什么意义?除了“用户可见”的同步,还有其他同步方式吗?
2. The finalize method is never invoked more than once by a Java virtual machine for any given object.

在这种情况下,JVM必须维护每个曾经创建的对象的唯一标识以及其finalize方法已被调用的信息。那么它最终不会超过其存储区域吗?

1
我猜想,关于第一点,这意味着线程可见的同步。至于第二点,一旦对象的终结器运行完毕,该对象就会消失,因此不需要进行进一步的簿记。 - Erik
第一点没问题。关于第二点的评论,请查看我对伊万回答的评论。 - RRM
3个回答

2
“用户可见”同步的意义是什么?
可以从 Java 代码中访问的锁。
除了“用户可见”之外,是否还有其他同步方式?
是的,JVM 内部有锁供其使用。
JVM 必须维护每个创建的对象的唯一标识和其 finalize 方法已被调用的信息。
对象是否已经被 finalized 存储在头文件中。没有全局 id 与对象相关。它唯一的特点就是对对象本身的引用。
它最终不会超出存储区域吗?
这个空间是在对象创建时分配的。
欲了解更多信息,请参阅 Java 中的对象复原

对象是否已被终结,存储在对象头中 - 这就消除了疑惑。谢谢! - RRM
@RRMadhav 添加了一个可能会有趣的链接。 - Peter Lawrey
我在这个网站上找到了一个相关的帖子,你也回答了它 :) https://dev59.com/F3zaa4cB1Zd3GeqPRY62 - RRM

1

我想象(!)第二点是通过在调用finalize()后删除该对象来实现的。这样不需要存储。


那么,谁清理GC对象的无效信息?是“Finalizer”线程还是“Reference Handler”线程? - RRM
@RRMadhav JVM会检查对象是否被添加到最终队列,并在此时设置它。同时,它还会检查finalize()方法是否被重写。 - Peter Lawrey

1
"什么是“用户可见”的同步的意义?除了“用户可见”之外,还有其他同步吗?我认为“用户可见的同步”是指任何锁定或同步代码,可以通过分析源编译器所看到的代码找到。 JVM实际上可能在内部使用许多其他锁和同步原语,这并不一定是开发人员关注的问题。
“JVM必须维护每个创建的对象的唯一标识,以及其finalize方法已被调用的信息。它不会超出存储区域吗?” 不会-因为一旦JVM调用finalize(),最终对象将被垃圾回收。"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接