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

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

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

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

还提到:

类本身可以被垃圾回收。

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

那么类的 GC 根是什么?

【问题讨论】:

  • GC 根是您列出的所有内容。您的问题实际上是关于什么样的对象通常包含对类对象的引用。

标签: java garbage-collection jvm


【解决方案1】:

那么类的 GC 根是什么?

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

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

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

【讨论】:

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

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

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

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

Source 1 Source 2

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 2010-12-25
  • 2019-03-27
相关资源
最近更新 更多