到底是哪些对象才是 GC Roots ?

在周志明老师的「深入理解java虚拟机」书中,介绍 GC Roots 时,说:

在Java技术体系里面,固定可作为GC Roots的对象包括以下几种:

  • 在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的
    参数、局部变量、临时变量等。
  • 在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量。
  • 在方法区中常量引用的对象,譬如字符串常量池(String Table)里的引用。
  • 在本地方法栈中JNI(即通常所说的Native方法)引用的对象。
  • Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如
    NullPointExcepiton、OutOfM emoryError)等,还有系统类加载器。
  • 所有被同步锁(synchronized关键字)持有的对象。
  • 反映Java虚拟机内部情况的JM XBean、JVM TI中注册的回调、本地代码缓存等。




现在只考虑 局部变量静态变量 所引用的对象。

所有的局部变量,和所有的静态变量,所引用的对象,都是 GC Root 吗???

那这 GC Root 也太多了!

假如,主类里有一个局部变量 AA 有一个局部变量 BB 有一个静态变量 C,那这三个对象都是 GC Root 吗?

还是只有 A 是 GC Root, 也就是只有 main方法里的局部变量 才是 GC Root ?

一条调用链上,有那么多 GC Root,有啥意义呢?

阅读 3.5k
2 个回答
所有的局部变量,和所有的静态变量,所引用的对象,都是 GC Root 吗???

那这 GC Root 也太多了!

对于人确实多,对于电脑其实没多少

假如,主类里有一个局部变量 A ,A 有一个局部变量 B,B 有一个静态变量 C,那这三个对象都是 GC Root 吗?还是只有 A 是 GC Root, 也就是只有 main方法里的局部变量 才是 GC Root ?

局部变量简单理解就是方法参数和方法里面定义的变量,约等于讲其实就是栈上的引用所引用的对象,对于用户来说确实是main方法里的局部变量,但是jvm上还有其他线程也有各自的栈也有各自的局部变量

一条调用链上,有那么多 GC Root,有啥意义呢?

java 的 gc 是找到所有存活对象然后把剩下的地方清理出来,必须找全,还是那句话,人看着多,计算机处理可能就几个纳秒的事情

仅供参考,欢迎指正
所有的局部变量,和所有的静态变量,所引用的对象,都是 GC Root 吗?
我觉得是的,因为要保证GC的完整性,一定要找到所有存活的对象
GC Root 也太多了!
按照现在默认的G1收集器的分代收集算法,一般不会full gc,都是局部gc不会使用到全部的GC Roots
三个对象都是 GC Root 吗?
我觉得局部变量 A才是GC Root,应该是GC STW时所在方法里面的局部变量作为GC Root
一条调用链上,有那么多 GC Root,有啥意义呢?
像上面说的要找到所有存活的对象,例如,一个对象的局部变量的为null了,但是还有静态变量引用这个对象,这时这个对象还是存活的对象。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏