如果不是父对象,在 super.finalize() 方法之后 GC 会在父对象上清除什么?
If not parent object, what does GC clear up on the parent after super.finalize() method?
我的问题基于以下事实:
- 每当我们创建子 class 时,即使调用了 super class 构造函数,也不会创建 superclass 对象。
- 如果在 subclass 中定义了 finalize() 方法,则还必须调用 super.finalize()。
一切都很好。但是当我使用 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()
你得到一个包含字段 a
和 b
的对象。所有这些超类的东西只在某些地方很有趣,比如访问 sub.a
或 instanceof
检查。
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 的基础。
我的问题基于以下事实:
- 每当我们创建子 class 时,即使调用了 super class 构造函数,也不会创建 superclass 对象。
- 如果在 subclass 中定义了 finalize() 方法,则还必须调用 super.finalize()。
一切都很好。但是当我使用 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()
你得到一个包含字段 a
和 b
的对象。所有这些超类的东西只在某些地方很有趣,比如访问 sub.a
或 instanceof
检查。
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 的基础。