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