Java虚拟机(JVM):第五幕:自动内存管理 - HotSpot算法细节以及低延迟垃圾收集器

发布时间 2023-07-13 09:41:19作者: 修炼诗人

一、HotSpot算法细节

  1、根节点枚举:所有的收集器在根节点枚举的时候,必须暂停用户线程,同时要保证一致性的快照中得以进行。一致性:整个枚举期间执行子系统看起来就像是冻结在某一个时间点上,不会出现分析过程中,根节点的对象应用关系还在不断变化的情况。

  2、安全点:用户程序执行到某一些位置的时候,才能够暂停下来进行垃圾回收。一般安全点的产生,只有在指令序列复用。垃圾收集的时候,所有线程跑到最近的安全点:抢先式中断和主动式中断。

  3、安全区域:这样的方式似乎解决停顿用户线程,但是如果程序“不执行”的话,程序也就没有分配处理器的时间,这样也就没有响应虚拟机的中断请求,这种情况,必须引入安全区域来解决问题。

  4、记忆集与卡表:记忆集:用于记录从非收集区域指向收集区域的指针集合的抽象数据结构。记忆集是一种比较“抽象”的数据结构,抽象的意思是只定义了记忆集的行为意图,并没有定义其行为的具体实现。卡表是记忆集的一种具体实现。

  5、写屏障:写屏障技术来维护卡表状态的。

  6、并发的可达性分析:解决并发扫描的对象消失问题,产生了两种解决方案:增量更新和原始快照。所谓的原始快照:当灰色对象要删除指向的白色对象的引用关系时,将要删除的引用记录下来,在并发扫描结束之后,再将这些记录过的引用关系的灰色对象为根,重新扫描一次、PS:也就是说无论引用关系是否删除,都需要按照刚刚开始扫描那一刻的对象图快照进行搜索。

二、低延迟垃圾收集器

  衡量垃圾收集器最重要的三项指标:内存占用、吞吐量、延迟。其中延迟被誉为垃圾收集器最受到重视的性能指标。只有Shenandoah和ZGC属于低延迟垃圾收集器,并且实现垃圾收集的停顿时间不超过10毫秒,只有初始标记、最终标记这些阶段有短暂的停顿,停顿时间为固定的,与堆的容量、堆的数量没有正比例关系。

  1、Shenandoah收集器:是最“孤独”的一个。Shenandoah收集器的目标是能够在任何的堆内存大小下都能够可以把垃圾收集的停顿时间控制在10毫秒以内。同时与G1一样的是,Shenandoah收集器使用基于Region的堆内存布局,和G1不同的是,它只是并发的整理算法,但是不能和用户线程并发。G1收集器中使用的记忆集,消耗了大量的内存和计算资源。所以在Shenandoah收集器中抛弃了这种方式,改用“连接矩阵”来记录跨Region的引用关系。收集器的工作流程分为以下九个阶段:1、初始标记。2、并发标记。3、最终标记。4、并发清理。5、并发回收。6、初始引用更新。7、并发引用更新。8、最终引用更新。9、并发清理。

  Shenandoah收集器用来支持并行整理的核心概念 -- Brooks Pointer。转发指针分散的存放在每一个对象头前面。

  2、ZGC收集器:具有实验性质的低延迟垃圾收集器,不设分代,仅使用读屏障、染色指针[直接将少量额外的信息存储到指针]、内存多重映射来实现标记 - 整理算法。与Shenandoah、G1收集器不同的是,ZGC采用的基于Region的堆内存布局具有动态性,设置了大、中、小三类容量。需要注意的是,因为大型的Region内存分配在ZGC的实现中是不会重新分配的,因为复制大对象的代价非常的昂贵。

  接下来介绍一下ZGC的核心问题---并发整理算法,具有标志性的设计,采用了染色指针技术。ZGC直接将标记信息记到了引用对象的指针上,从而变成了遍历“引用图”来标记“引用”了。把染色指针中的标志位看做是地址的分段符,将不同的地址段都映射到同一个物理内存空间,经过多重映射转换后,使用染色指针可以正常进行寻址。ZGC的多重映射是采用染色指针技术的伴生产物,并不是专门为了实现其他的某种特性需求而去做的。

  ZGC收集器的工作流程:1、并发标记。2、并发预备重分配。3、并发重分配。4、并发重映射。

  当对象处于重分配中,用户线程在这个时候访问了此对象,则该访问会被预置的内存屏障截获,同时根据Region的转发表将访问转发到新复制的对象上,同时修正更新该引用的值,使其指向新的对象,ZGC将这种行为称为指针的“自愈能力”。

  巧妙地不止这个,还有并发重映射,重映射所要做的是修正整个堆中指向重分配集中旧对象的所有引用,但并不是一个迫切去完成的任务,之所以重映射这些旧引用是为了不变慢,所以说这个并不是很迫切,于是,巧妙地将并发重映射阶段做的工作,合并到了下一次垃圾收集循环中的并发标记阶段去完成。因此,基于上述过程,ZGC收集器和Shenandoah收集器做到了几乎可以在整个收集过程并发。  

  ZGC收集器有一个技术优点:支持“NUMA-Aware”的内存分配,NUMA是为多处理器或者是多核处理器的计算机所设计的内存架构。

额外的知识点:

1、内存屏障:

2、虚拟内存映射技术: