什么是类的 GC 根?

Posted

技术标签:

【中文标题】什么是类的 GC 根?【英文标题】:What are GC roots for classes? 【发布时间】:2015-01-27 00:04:43 【问题描述】:

在 Java 中,有称为 垃圾收集根(GC 根)的特殊对象。它们作为垃圾收集标记机制的根对象(见图)。

This article 描述了四种类型的 GC 根:

局部变量 活动线程 静态变量 JNI 参考

还提到:

类本身可以被垃圾回收。

没有收集 GC 根,因此类本身不是 GC 根。

那么类的 GC 根是什么?

【问题讨论】:

GC 根是您列出的所有内容。您的问题实际上是关于什么样的对象通常包含对类对象的引用。 【参考方案1】:

那么类的 GC 根是什么?

类加载器,有效地 - 通过其他 GC 根。

如果没有任何东西可以到达类加载器 - 这意味着没有任何东西可以到达由该类加载器创建的任何类或这些类的任何实例 - 那么类加载器和它创建的类都可以进行垃圾回收。在此之前保持它们处于活动状态是必要的,以便 Class::forName 和 ClassLoader::findClass 即使在类的静态初始化器不是时也可以是幂等的。

隐藏类(参见https://openjdk.java.net/jeps/371)是此规则的例外。作为 OpenJDK 的实现细节,使用 java.lang.reflect.Proxy 的静态方法创建的方法引用、lambda 和代理类也是如此。类加载器不持有对这些类的强引用。

【讨论】:

类加载器实例驻留在堆上? @g***:他们肯定不在堆栈上。堆的哪个精确部分是另一回事。 @g***:这是堆的一部分。这就是我所说的“堆的哪个精确部分是另一回事”.... 只是官方 oracle 文档调用 permgen 作为 heap 的一部分,但通常在社区中 heap = [young gen] + [old gen]【参考方案2】:

垃圾回收根是可以从堆外访问的对象。

Memory Analyzer 根据以下列表对垃圾收集根进行分类:

    由系统 ClassLoader 加载的类 JDK 类中的静态字段(java.* 等) 活动线程 stack -local 变量,方法参数 java.lang.Thread实例 作为同步监视器保存的对象 JNI 参考 JVM 特价商品...

Source 1 Source 2

【讨论】:

YourKit 文档中也有很好的参考:yourkit.com/docs/java/help/gc_roots.jsp

以上是关于什么是类的 GC 根?的主要内容,如果未能解决你的问题,请参考以下文章

jvm知识点总览

jvm知识点总览

JVM知识点总结

面向对象程序设计中啥是类类有几种特性

28 Java类的加载机制什么是类的加载类的生命周期加载:查找并加载类的二进制数据连接初始化类加载器双亲委派模型自定义类加载器

什么是类的继承性?Java中子类和父类有什么关系?