所谓“GC roots”,或者说tracing GC的“根集合”,就是一组必须活跃的引用。例如说,这些引用可能包括:
(1)所有Java线程当前活跃的栈帧里指向GC堆里的对象的引用;换句话说,当前所有正在被调用的方法的引用类型的参数/局部变量/临时值。
(2)VM的一些静态数据结构里指向GC堆里的对象的引用,例如说HotSpot VM里的Universe里有很多这样的引用。
(3)JNI handles,包括global handles和local handles
(4)(看情况)所有当前被加载的Java类
(5)(看情况)Java类的引用类型静态变量
(6)(看情况)Java类的运行时常量池里的引用类型常量(String或Class类型)
(7)(看情况)String常量池(StringTable)里的引用
注意,是一组必须活跃的引用,不是对象。
作者:RednaxelaFX
链接:https://www.zhihu.com/question/53613423/answer/135743258