JVM 的 gc roots 有哪些 ?

在之前的博客中, 我们提到过引用树的可达性分析, 用来判断是否可以进行GC, 出发点是 GC roots, 那么 GC Roots 有哪些呢 ?

GC Roots


  • 栈中引用的本地变量
  • Class, 系统类加载器加载的, 这些不会被卸载. 但自定义类加载器加载的不是roots.
  • 方法区中类静态属性引用的对象
  • 方法区中常常量引用的对象
  • JNI 引用的本地变量
  • JNI 全局引用
  • 线程, 活着的线程
  • 被用于 synchronization 监视的对象
  • 被 jvm 持有引用的
  • main 方法中的本地变量
  • main 线程
  • main class 的静态变量

参考


https://www.dynatrace.com/resources/ebooks/javabook/how-garbage-collection-works/
https://www.yourkit.com/docs/80/help/gc_roots.jsp