JDK21默认GC是G1.
JDK21除了G1外,还可以使用ZGC(Java11预览、Java15正式版),Java21在ZGC基础上继续推出了分代ZGC,目前还是试行阶段。

开启ZGC:

java -XX:+UseZGC -jar myapp.jar

开启ZGC,并试用分代ZGC

java -XX:+UseZGC -XX:+ZGenerational -jar myapp.jar

以下的对一个启用tomcat虚拟线程的spring boot 项目分别以默认GC/ZGC/分代ZGC进行高并发测试,测试过程中,对该app占用操作系统的物理内存进行统计,然后形成统计折线图:

三种GC下的压测对并发性能几乎无差别的情况下,三者的内存表现大为不同,特别是G1与两个ZGC的差异尤为明显。
虽然本次比较测试的场景比较单一,但大致能看出ZGC的垃圾回收效率比G1高。
ZGC在垃圾回收的优势主要是:

  • 低卡顿: 最大暂停时间不超过10 ms
  • 高吞吐: 短时间可以回收大量内存
  • 大堆内存支持:对于大规模的应用程序,ZGC 的能力非常有价值,可以降低碎片化的影响。
  • 分区化处理:对不同大小的内存进行分区化处理,可以加快小内存回收

代码已上传gitee