这个章节,我看了一点点...稍微了解下,后面在做补充
枚举根节点
以可达性分析(根节点搜索算法)为例,它对执行时间的敏感体现在GC停顿上,因为这项分析工作必须在一个能确保一致性的快照中进行。
这里的一致性的意思:
整个分析期间整个执行系统看起来就像被冻结在某个时间点上,不可以出现分析过程中对象引用关系还在不断变化的情况。
这点不满足的话 分析结果的准确性就无法得到保证。
(还记得之前那个 "妈妈打扫房间的栗子嘛...")
由于目前主流的Java虚拟机使用的都是准确式GC,所以当执行系统停顿下来之后,并不需要一个不漏的检查所有引用位置,虚拟机有办法自己得知。
在Hotpost虚拟机中使用OopMap的数据结构来达到这个目的。
注:
准确式GC,即虚拟机可以知道内存中某个位置的数据具体是什么类型。这样子才能在GC(垃圾收集)的时候准确判断堆上的数据是否还可能被使用。
安全点
在OopMap的协助下,HotSpot可以快速且准确的完成GC Roots枚举,但一个很现实的问题随之而来:
可能导致引用关系变化,或者说OopMap内容变化的指令非常多,如果为每一条指令都生成对应的OopMap,那会需要大量额外的空间。
这样子GC的空间成本会变得很高。
实际上,Hotspot也的确没有为每条指令都生成OopMap,只有在"特定的位置"才记录这些信息,这些位置称之为安全点。
在程序执行时并非在所有地方都能停顿下来开始GC,只有在到达安全点时才能暂停。