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

标签 java inheritance garbage-collection jvisualvm

我的问题基于以下事实:

  • 每当我们创建子类时,即使调用了父类(super class)构造函数,也不会创建父类(super class)对象。
  • 如果子类中定义了finalize()方法,则也必须调用super.finalize()。

这一切都很好。但是当我使用jvisualjvm(在JDK安装的/bin目录下 - 我没有看到任何创建的父类(super class)对象实例,这正如我所期望的那样。父类(super class)对象当我们创建它的子类实例时,它并没有被创建。

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

如果双击并打开jvisualjvm,您可以看到(如果您使用Thread.sleep(forEnoughTimeToCheck_jvisualjvm)停止程序)...您将不会在那里找到父类(super class)实例,只有子类......可能只是引用。那么GC每次都会清除父类(super 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.

最佳答案

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

不存在对父类(super class)实例的引用之类的东西。有两个类,例如

class Super {
    int a;
}

class Sub extends Super {
    int b;
}

new Sub()你会得到一个包含字段ab的对象。所有这些父类(super class)内容仅在某些地方有趣,例如访问 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 的对象分配空间
  • 它通过调用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 的基础。

关于java - 如果不是父对象,那么在 super.finalize() 方法之后 GC 会在父对象上清除什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31105907/

相关文章:

java + 使用wait和notify我们会错过信号吗?

c++ - friend 父类无法访问子类中的私有(private)构造函数

java - 为什么父类和子类都实现相同的接口(interface)?

.net - GC.SuppressFinalize 性能与不可终结对象相比

Node.js:如何从内存中释放 Mongoose 模型? (内存泄漏)

java - 如何在图像上显示 JButton?

java - Log4j 无法登录到文件

java - 如何使用 ant 构建需要外部 jar 的小程序?

c++ - 类继承虚拟字符串不返回正确的东西

java - 焊接实例<>和垃圾收集器