在周志明老师的「深入理解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,有啥意义呢?
是
对于人确实多,对于电脑其实没多少
局部变量简单理解就是方法参数和方法里面定义的变量,约等于讲其实就是栈上的引用所引用的对象,对于用户来说确实是main方法里的局部变量,但是jvm上还有其他线程也有各自的栈也有各自的局部变量
java 的 gc 是找到所有存活对象然后把剩下的地方清理出来,必须找全,还是那句话,人看着多,计算机处理可能就几个纳秒的事情