根节点枚举

根节点枚举:就是找出所有的GC Roots

问题

固定的可做为GC Roots的节点主要在全局性的引用(常量,类静态属性)与执行上下文(栈桢的本地变量表),

尽管目标明确,但查找过程如何做到高效,光方法区的大小就可能有数百上千兆。

目前所有收集器在根节点枚举这一步骤都是必须暂停用户线程的(Stop The World)。

OopMap

目前主流Java虚拟机使用的都是准确式垃圾收集,

指虚拟机知道内存中某个位置的数据具体是什么类型。

当用户线程停顿下来之后,其实不需要一个不漏地检查所有执行上下文和全局的引用位置,虚拟机应当是有办法直接得到哪些地址存放着对象引用的。

HotSpot的解决方案里,是使用一组称为OopMap的数据结构来达到这个目的的。

一旦类加载动作完成的时候,HotSpot就会把对象内什么偏移量上是什么类型的数据计算出来,

在即时编译过程中,也会在特定的位置记录下栈里和寄存器里哪些位置是引用。

这样收集器在扫描时就可以直接得知这些信息了,并不需要真正一个不漏地从方法区等GC Roots开始查找

所以OopMap的作用就是存储内存中哪些位置存储了对象引用。

// TODO 不是很明白