您的位置:首页 > 娱乐 > 八卦 > JVM 在GC 时的根对象都有那些

JVM 在GC 时的根对象都有那些

2025/1/15 18:04:43 来源:https://blog.csdn.net/u014745465/article/details/141462729  浏览:    关键词:JVM 在GC 时的根对象都有那些

在 Java 的垃圾回收(Garbage Collection,GC)过程中,根对象(Roots)是用于判断哪些对象是可达的基础。根对象通常是一组特定的对象引用,从这些对象出发,GC 可以判断哪些对象仍然存活,哪些对象可以被回收。以下是 Java 中常见的根对象类型:

1. 栈帧中的局部变量

  • 每个线程在执行方法时都有自己的栈帧,局部变量和输入参数的引用在栈帧中,属于根对象。
  • 当方法调用结束,局部变量会被销毁,栈帧也会被清理。

2. 静态字段

  • 静态字段是属于类的变量,它们在类加载时被存储在方法区。只要类被加载,静态字段的引用通常不会被 GC 回收。
  • 例如:public static MyClass staticInstance;

3. JNI 引用

  • 在 Java Native Interface (JNI) 中保存的对象引用也是根对象。这些引用来自于本地代码(通常是用 C 或 C++ 编写)并且被 JVM 执行时引用。

4. 常量池中的引用

  • 字符串常量和其他字面量常量(例如,整型常量)也可以视为根对象。比如在字符串池中常量的存在。

5. 程序计数器

  • JVM 在执行线程分配的计数器,包含当前线程正在执行的字节码的地址,它也包含指向栈帧的引用。

6. 长时间运行的对象

  • 如 singleton(单例模式)中持有的对象,即使不在局部变量或静态字段中也可能被视为根对象。

7. Thread 引用

  • 活动线程的引用也被视为根对象,线程在运行时可能会持有对其他对象的引用。

8. 软引用和弱引用的引用队列

  • 在使用软引用(SoftReference)和弱引用(WeakReference)时,如果这些对象添加到引用队列(ReferenceQueue),它们的引用也可以被视为根对象。

总结

在 Java GC 的可达性分析中,根对象是关键起点,以下是其主要类型:

  1. 栈帧中的局部变量
  2. 静态字段
  3. JNI 引用
  4. 常量池中的引用
  5. 程序计数器
  6. 长时间运行的对象
  7. Thread 引用
  8. 软引用和弱引用的引用队列

这些根对象可帮助 GC 判断哪些对象是可达的,从而决定哪些对象可以被回收。理解根对象是优化内存使用和管理的重要一环。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com