请大佬看看!小弟想不通 ,到底是哪些对象才是 GC Roots ?

发布于 2022-09-30 23:09:51 字数 909 浏览 27 评论 0

在周志明老师的「深入理解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,有啥意义呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦旅人picnic 2022-10-07 23:09:51

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

那这 GC Root 也太多了!

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

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

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

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

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

未央 2022-10-07 23:09:51

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文