//本文不建议阅读,非常混乱,内容不衔接,缺少信息等
文章内容来自《深入了解JVM虚拟机》
我们在之前两篇Blog中介绍了对象存活判定算法[引用计数算法和可达性分析算法]和垃圾收集算法,而在HotSpost虚拟机上实现这些算法时,必须对算法的执行效率又严格的考量,才能保证虚拟机高效运行
枚举根节点
可达性分析算法主要有两个问题
- 可作为GC Roots的节点主要在全局性的引用[例如常量或类静态属性]与执行上下文(例如栈帧中的本地变量表)中,现在很多应用仅仅方法区就有数百兆,如果要逐个检查这里面的引用,会消耗大量时间
- 当虚拟机寻找GC Roots时,不可以出现分析过程中对象引用关系还在不断变化的情况,该点不满足的话分析结果的准确性就无法得到保证
HotSpot通过OopMap这个数据结构解决了第一个问题。在类加载之后虚拟机就把对象内什么偏移量上是什么类型的数据计算出来,在JIT编译时也会在“安全点”记录下栈和寄存器中哪些位置是引用。“安全点”是什么呢?线程不能在任何地方都能停顿下来开始GC,只能在safepoint停下来。安全点不能太少,也不能太多,所以就是具有方法调用,循环跳转和异常跳转的指令才会产生Safepoint
JVM如何是线程都”跑到“安全点再停顿下来呢?
- 抢断式中断
- 主动式中断