繁体   English   中英

什么是类的 GC 根?

[英]What are GC roots for classes?

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

在此处输入图片说明

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

  • 局部变量
  • 活动线程
  • 静态变量
  • JNI 引用

还提到:

类本身可以被垃圾收集。

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

那么类的 GC 根是什么?

那么类的 GC 根是什么?

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

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

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

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

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

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

来源 1 来源 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM