今天看啥  ›  专栏  ›  小巷子

HotSpot算法实现细节

小巷子  · 掘金  ·  · 2021-04-02 09:07
阅读 4

HotSpot算法实现细节

根节点枚举

1、根节点也称(GC Roots),迄今为止,所有收集器在根节点枚举这一步时都必须暂停用户线程,因此会造成用户线程出现短暂的“Stop The Word”。

2、主流Java虚拟机使用的都是准确式垃圾收集,当所用用户线程停顿下来之后,并不需要JVM一个不漏的检查完所有执行上下文和全局的引用位置;而是使用一组称为Oop(Ordinary Object Pointer 普通对象指针)Map 的数据结构来达到快速扫描的目的.

安全点(Safe Point)

1、由于HotSpot并没有为每条指令都生成OopMap,因此需要在“特定的位置”记录这些重要的信息,而这些位置就是我们平时所说的安全点,安全点的设定,决定了用户程序执行时并非在代码指令流的任意位置都能够停顿下来开始垃圾收集,而是强制要求必须执行到达安全点后才能够暂停。

2、为了在垃圾收集发生时让所有线程都跑到最近的安全点,目前有提供两种方式:a.抢断式中断 该中断方式不需要线程的执行代码主动去配合,在垃圾收集发生时,系统首先把所有用户线程全部中断,如果发现用户线程中断的地方不在安全点上,就恢复这条线程执行,让他一会再重新中断,直到跑到安全点上(目前基本没有虚拟机采用这种方式) b.主动式中断 该方式是当垃圾收集需要中断线程的时候,不直接对线程操作,只是简单的设置一个标志位,各个线程执行过程会不停的主动轮训这个标志,一旦发现中断标志为真就在最近的安全点上主动中断挂起。

安全区域

概念:安全区域主要是针对程序“不执行”,没有得到处理器分配的时间,导致无法走到安全点而设定的一块区域 安全区域是指能够保证在某一段代码片段之中,引用关系不会发生变化,因此,在这个区域中任意地方开始垃圾收集都是安全的,安全区域可以看做是被扩展拉伸了的安全点

并发的可达性分析

并发的可达性分析目的是为了解决或降低用户线程的停顿。 三色标记法

白色:表示对象尚未被垃圾收集器访问过。显然在可达性分析刚刚开始的阶段,所有的对象都是白色的,若在分析结束的阶段,仍然是白色的对象,即代表不可达

黑色:表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已近被扫描过。黑色的对象代表已经扫描过,它是安全存活的,如果有其他对象引用指向了黑色对象,无需重新扫描一遍,黑色对象不可能直接指向某个白色对象

灰色:表示对象已经被垃圾收集器访问过,但这个对象上至少存在一个引用还没有被扫描过




原文地址:访问原文地址
快照地址: 访问文章快照