什么是类的 GC 根?

2022-08-31 22:10:32

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

enter image description here

本文介绍四种类型的 GC 根目录:

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

还提到:

类本身可以被垃圾回收。

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

那么,这些类的GC根源是什么呢?


答案 1

那么,这些类的GC根源是什么呢?

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

如果没有任何东西可以到达类装入器 - 这意味着没有任何东西可以到达该类装入器创建的任何类或这些类的任何实例 - 那么类装入器和它创建的类都有资格进行垃圾回收。保持它们处于活动状态直到那时是必要的,以便 Class::forName 和 ClassLoader::findClass 可以是幂等的,即使类的静态初始值设定项不是。

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


答案 2

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

内存分析器根据以下列表对垃圾回收根进行分类:

  1. 由系统类加载器装入的类
    • JDK 类中的静态字段(java.* 等)
  2. 实时线程
    • 堆栈 -本地变量,方法参数
    • java.lang.Thread实例
  3. 作为同步监视器保存的对象
  4. JNI 参考
  5. JVM特价...

源 1 源 2