根节点枚举
根节点枚举:就是找出所有的GC Roots
。
问题
固定的可做为GC Roots
的节点主要在全局性的引用(常量,类静态属性)与执行上下文(栈桢的本地变量表),
尽管目标明确,但查找过程如何做到高效,光方法区的大小就可能有数百上千兆。
目前所有收集器在根节点枚举这一步骤都是必须暂停用户线程的(
Stop The World
)。
OopMap
目前主流Java
虚拟机使用的都是准确式垃圾收集,
指虚拟机知道内存中某个位置的数据具体是什么类型。
当用户线程停顿下来之后,其实不需要一个不漏地检查所有执行上下文和全局的引用位置,虚拟机应当是有办法直接得到哪些地址存放着对象引用的。
在HotSpot
的解决方案里,是使用一组称为OopMap
的数据结构来达到这个目的的。
一旦类加载动作完成的时候,
HotSpot
就会把对象内什么偏移量上是什么类型的数据计算出来,在即时编译过程中,也会在特定的位置记录下栈里和寄存器里哪些位置是引用。
这样收集器在扫描时就可以直接得知这些信息了,并不需要真正一个不漏地从方法区等
GC Roots
开始查找所以
OopMap
的作用就是存储内存中哪些位置存储了对象引用。// TODO 不是很明白