请大佬看看!小弟想不通 ,到底是哪些对象才是 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 也太多了!
假如,主类里有一个局部变量 A
,A
有一个局部变量 B
,B
有一个静态变量 C
,那这三个对象都是 GC Root 吗?
还是只有 A
是 GC Root, 也就是只有 main方法里的局部变量
才是 GC Root ?
一条调用链上,有那么多 GC Root,有啥意义呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
是
对于人确实多,对于电脑其实没多少
局部变量简单理解就是方法参数和方法里面定义的变量,约等于讲其实就是栈上的引用所引用的对象,对于用户来说确实是main方法里的局部变量,但是jvm上还有其他线程也有各自的栈也有各自的局部变量
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了,但是还有静态变量引用这个对象,这时这个对象还是存活的对象。