学习内容:第3章 - 垃圾收集器与内存分配策略
HotSpot 垃圾收集算法的实现细节
前面学习的垃圾收集相关算法在实现时,对于执行效率有严格的考量,因此了解实现细节也是比较重要的一点。
根节点枚举
可达性分析算法从 GC Roots 集合中查找引用链的操作里,固定可作为的 GC Roots 的节点目标较为明确,但是要想做到高效的查找并非容易的事,尤其是现在 Java 程序越来越庞大,逐个检查引用肯定要消耗不少时间。
到目前为止,所有的收集器在根节点枚举这一步骤时,都需要暂停用户线程,也就是面临着“Stop The World”。目前可达性分析算法中,查找引用链的过程已经可以做到和用户线程一起并发执行,但根节点枚举这一操作还是必须在一个能够保障一致性的快照中才能正常进行,在这个过程里,分析时根节点集合的对象引用关系不能变化,如果这一点不能保证,分析结果的准确性就不能保证,这也是为什么垃圾收集过程里,根节点枚举必须暂停用户线程。
在 HotSpot 中,虚拟机使用一组称为 OopMap
的数据结构来达到直接获取到哪些地方存储着对象引用的目的。在类加载完成时,HotSpot 就会把对象内什么偏移量上是什么类型的数据计算出来,即时编译时,也会在特定位置记录下栈里和寄存器里哪些位置是引用,这样收集器就可以在扫描时直接得知这些信息。