G1 收集器【JVM调优】

1. 分区收集器

① G1:分区算法,物理上不分代,逻辑分代。每次只回收快满了的几个小区域,对于较大的 Eden 区,回收效率还不算很高;
② ZGC:分页算法,它是完全没有 Eden 区概念的,一视同仁,非常灵活,效率很高;
③ Shenandoah:也是分页,与 ZGC 的算法很类似,只不过 ZGC 只有一个屏障,而 Shenandoah 是三个屏障,虽然说 Shenandoah 的承受度要更高一些,但是毕竟 ZGC 是官方支持的,而 Shenandoah 只是开源的;
④ Epsilon:它其实是给 JVM 的开发者 debug 用的,起到一个跟踪的作用。

2. G1 收集器

依然没有官方的概述,我们还是直接上大白话。
首先要知道,G1 跟其他垃圾收集器最大的区别:G1 摒弃了分代模型

通过上一篇文章我们知道,前面提到的那几个垃圾回收器,它们其实都是两两配合使用的,就比如 CMS 和 Parnew,每个收集器负责一个代,即新生代和老年代。

G1 准确地说应该是,在物理上不分代,逻辑上是分代的,所以会有 Eden 区和 Old 区的概念,同时,G1 的 E、O 区并不是固定的,在下次分配的时候或许 E、O 区就互换了!

以往进行垃圾回收的时候,都需要把整体年轻代都扫完,然而随着年轻代越来越大,GC 扫描的效率是可想而知的,很慢。另外,由于 CMS 固有的 bug,必须得改进才能避免漏标。因此,出现了 G1,它是目前主流的垃圾回收器。

在这里插入图片描述

G1 垃圾回收器采用分区算法。部分回收,只回收快满了的几个小区域,而空着的区域可以被其他对象占用。如果对象需要连续内存就把它放到 Humongous 里面,连续区域不够用时就进行一次 Full GC。

但是它也有自己的缺点,它一次回收会把 Eden 区全部回收完,当 Eden 区很大时,一次 YGC 产生的 SWT 时间也非常长,因此,诞生了 ZGC。

ZGC 是分页算法,非常灵活,它也不分代,内存增大,停顿时间较短,是 golong 的核心算法。每 100ms 触发一次 GC,清理掉那些特别满的区域。ZGC 的核心算法为颜色指针(Colored Pointer)和读屏障(Load Barrier)。

猜你喜欢

转载自blog.csdn.net/m0_52861684/article/details/132733622