如果不是父对象,在 super.finalize() 方法之后 GC 会在父对象上清除什么?

If not parent object, what does GC clear up on the parent after super.finalize() method?

我的问题基于以下事实:

一切都很好。但是当我使用 jvisualjvm(在 JDK 安装的 /bin 目录下 - 我没有看到任何超级 class 对象实例创建和正如我所料。当我们创建它的 subclass 实例时,不会创建 Superclass 对象。

My question: What does GC clear up on part of the super class?

如果你双击并打开 jvisualjvm,你会看到(如果你用 Thread.sleep(forEnoughTimeToCheck_jvisualjvm) 暂停你的程序)......你将找不到超级 class 实例那里,只有 subclass...可能只是参考。那么 GC 是否会在任何时候清除超级 class 引用?

I have seen many many blogs and posts on SO but I haven't seen any of them explain what GC clears up on part of super class.

什么都没有(除了每个垃圾收集阶段的内部状态),但是因为子class是它的超级class的一个实例,终结器通常是链接的(就像构造函数隐式调用 super 并且 toString 也是如此)。 super class 可能持有的任何资源都应该 free 并进行垃圾收集。

So does the GC clears up the super class reference whenever it does?

不存在对超类实例的引用这样的东西。有两个类喜欢

class Super {
    int a;
}

class Sub extends Super {
    int b;
}

new Sub() 你得到一个包含字段 ab 的对象。所有这些超类的东西只在某些地方很有趣,比如访问 sub.ainstanceof 检查。

Whenever we create a sub class, the superclass object is not created even if the super class constructor is invoked.

是的....像new Sub()这样的调用会做三件事:

  • 它为一个大到足以容纳两个 int 的对象分配 space
  • 它通过调用Super#Super
  • 的代码来初始化其中的一部分
  • 它通过调用Sub#Super
  • 的代码来初始化其中的一部分

Sub 构造函数主体中包含或暗示的对 super() 的调用根本没有分配,只是初始化。


GC 根本不关心。它所需要的只是知道对其他对象的引用在哪里(在我的示例中没有任何地方,因为只有原始字段)。

If finalize() method is defined in subclass then super.finalize() must be called also.

finalize 是一种得到特殊处理的特殊方法,但同样,如果 Sub#finalize 覆盖 Super#finalize,则后者变得无关紧要(除非从前者明确调用,它应该,但那是另一回事了)。

请注意 finalize 很少使用,可能只有百万分之一的对象。你不应该覆盖它,除非你知道你真的需要它。这不是 GC 的基础。