12 张图带你彻底理解 ZGC
发布网友
发布时间:2024-10-13 12:50
我来回答
共1个回答
热心网友
时间:2024-10-14 06:44
ZGC(Z Garbage Collector)是一款性能优于G1的垃圾收集器。ZGC自JDK 11作为实验特性引入,至JDK 15正式投入使用。启用方式为使用–XX:+UseZGC。ZGC有三大特色:
1. 内存多重映射:ZGC使用mmap技术将不同的虚拟内存地址映射到同一物理内存地址,从而在Marked0、Marked1和Remapped三个虚拟内存中灵活高效地管理内存。应用程序在创建对象时,为对象在上述三个视图空间分别申请一个虚拟地址,这三个虚拟地址映射到同一物理地址。Marked0、Marked1和Remapped作为ZGC的三个视图空间,同一时间点内只能有一个有效,通过切换视图空间完成并发的垃圾回收。
2. 染色指针:ZGC使用染色指针技术将GC信息保存在指针上,提升GC效率。在64位JVM中,对象指针为64位,高16位用于寻址,剩下48位可管理内存达到256TB。ZGC仅用高4位存储4个标志位,最大内存管理可达16TB。通过这4个标志位,JVM可以直接从指针上获取对象的三色标记状态、是否进入重分配集和是否需要通过finalizer访问的信息,无需进行对象访问即可获得GC信息。
3. 内存布局:ZGC基于Region进行内存分布,不区分新生代和老年代,支持动态创建和销毁,包括三种类型的Region。与G1类似,ZGC的内存布局同样基于Region,但其设计更注重并发和效率。
4. 读屏障:读屏障技术是ZGC在解释执行时向应用代码中插入的小段代码,当线程从堆中读取对象引用时执行。它判断对象引用是否满足条件,执行相应动作,以实现高效的并发收集。读屏障会略微影响应用性能,但提高了GC并发能力,降低了停顿时间。
5. GC过程:ZGC的垃圾收集过程包括标记、转移和重定位三个阶段。标记阶段从GC Roots出发,找出直接引用的对象,放入活跃对象集合。并发标记阶段GC线程和应用线程并行运行,标记过程中可能有引用关系变化导致的漏标记问题,再标记阶段重新标记并发标记阶段变化的对象。初始转移和并发转移阶段将活跃对象复制到新内存,转移过程对象地址发生改变,在重定位阶段调整所有指向对象旧地址的指针。
6. 垃圾收集算法:ZGC采用标记-整理算法,将存活对象移动到堆的一侧,移动完成后回收边界以外的对象。在JDK 16之前,ZGC预留了一块堆内存,以支持简单的并行收集算法,但存在预留内存的问题。JDK 16改进后支持就地搬移对象,无需预留空闲内存。尽管就地搬移带来了挑战,如考虑搬移对象顺序,但总体提高了GC表现。
ZGC的引入使并发性能大幅度提升,STW时间几乎只与GC Roots数量相关,不随堆大小和对象数量变化。ZGC的并发性能和内存管理技术显著改善了Java应用的垃圾回收效率,但其浮动垃圾问题仍然存在。