ZGC初体验

本文对比了JDK8的G1垃圾收集器与JDK11的ZGC在不同内存设置下的性能表现。在2G内存下,ZGC的平均收集时间为1.41毫秒,而G1为5.15毫秒;在8G内存下,ZGC保持在1.37毫秒。尽管ZGC在大内存场景下表现优秀,但在8G内存测试中,程序实际使用内存未达到预期。ZGC在减少垃圾收集时间方面明显优于G1,且两者CPU利用率相近。


JDK11发布了,ZGC的相关描述很诱人,体验了一下。
一共测试了三次,分别使用JDK8和JDK11。使用JMeter做压力测试,比较G1和ZGC的差别。

JDK8下的G1

JAVA_OPTS=" -Xms2g -Xmx2g -Xmn1400m -XX:+UseG1GC -XX:InitiatingHeapOccupancyPercent=60 "
JAVA_OPTS="$JAVA_OPTS -XX:MaxGCPauseMillis=50 -XX:+PrintGCDetails -verbose:gc   -Xloggc:./g1-gc.log"

大约测试了半个小时,使用visualvm_142查看CPU和内存使用情况:
在这里插入图片描述

GC情况:
在这里插入图片描述

可见,G1的性能还是不错的。
一共收集467次。一共耗时2405毫秒,平均每次5.15毫秒。

JDK11下的ZGC(2G内存)

JAVA_OPTS=" -server -Xms2g -Xmx2g -XX:ConcGCThreads=4 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC "
JAVA_OPTS="$JAVA_OPTS    -Xlog:gc*:file=gis-gc.txt "

同样使用2G内存,测试半小时。

visualvm_142不支持ZGC,所以,使用JDK11自带的jconsole查看:
在这里插入图片描述

一共972次收集,耗时1373毫秒。平均每次1.41毫秒。

JDK11的ZGC(8G内存)

据Oracle的宣传,ZGC特别适合大内存的情况。
于是,增大内存配置,继续测试半小时。

JAVA_OPTS=" -server -Xms8g -Xmx8g -XX:ConcGCThreads=4 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC "
JAVA_OPTS="$JAVA_OPTS    -Xlog:gc*:file=gis-gc.txt "

jconsole输出如下:
在这里插入图片描述

813次收集,耗时1113毫秒。平均每次1.37毫秒。

测试比较失败,因为虽然配置了8G内存,但是,实际使用的内存很少超过1.5G。
以后试试怎么提升程序使用的内存量。

可以看出来,ZGC的性能相比G1还是提高很多的
JDK8下的G1和JDK11下的ZGC,CPU利用率基本没差别。

下面贴一段ZGC的收集日志:

[1131.279s][info][gc,start    ] GC(502) Garbage Collection (Proactive)
[1131.280s][info][gc,phases   ] GC(502) Pause Mark Start 0.719ms
[1131.314s][info][gc,phases   ] GC(502) Concurrent Mark 34.151ms
[1131.315s][info][gc,phases   ] GC(502) Pause Mark End 0.066ms
[1131.315s][info][gc,phases   ] GC(502) Concurrent Process Non-Strong References 0.564ms
[1131.315s][info][gc,phases   ] GC(502) Concurrent Reset Relocation Set 0.008ms
[1131.315s][info][gc,phases   ] GC(502) Concurrent Destroy Detached Pages 0.001ms
[1131.317s][info][gc,phases   ] GC(502) Concurrent Select Relocation Set 1.367ms
[1131.317s][info][gc,phases   ] GC(502) Concurrent Prepare Relocation Set 0.030ms
[1131.317s][info][gc,phases   ] GC(502) Pause Relocate Start 0.565ms
[1131.319s][info][gc,phases   ] GC(502) Concurrent Relocate 1.343ms
[1131.319s][info][gc,load     ] GC(502) Load: 6.96/7.15/7.00
[1131.319s][info][gc,mmu      ] GC(502) MMU: 2ms/25.6%, 5ms/70.2%, 10ms/85.1%, 20ms/92.1%, 50ms/95.8%, 100ms/97.5%
[1131.319s][info][gc,marking  ] GC(502) Mark: 4 stripe(s), 3 proactive flush(es), 1 terminate flush(es), 0 completion(s), 0 continuation(s) 
[1131.319s][info][gc,reloc    ] GC(502) Relocation: Successful, 7M relocated
[1131.319s][info][gc,nmethod  ] GC(502) NMethods: 5130 registered, 1910 unregistered
[1131.319s][info][gc,metaspace] GC(502) Metaspace: 59M used, 59M capacity, 59M committed, 60M reserved
[1131.319s][info][gc,ref      ] GC(502) Soft: 6431 encountered, 0 discovered, 0 enqueued
[1131.319s][info][gc,ref      ] GC(502) Weak: 4778 encountered, 538 discovered, 0 enqueued
[1131.319s][info][gc,ref      ] GC(502) Final: 32 encountered, 7 discovered, 0 enqueued
[1131.319s][info][gc,ref      ] GC(502) Phantom: 306 encountered, 238 discovered, 0 enqueued
[1131.319s][info][gc,heap     ] GC(502)                Mark Start          Mark End        Relocate Start      Relocate End           High               Low         
[1131.319s][info][gc,heap    
07-18
### ZGC垃圾回收器的工作原理 ZGC(Z Garbage Collector)是一种专为低延迟和高吞吐量设计的Java虚拟机(JVM)垃圾回收器。其核心工作原理基于以下关键技术: 1. **并发标记与转移**:ZGC在标记阶段和转移阶段均采用并发执行的方式,即垃圾回收线程与应用程序线程同时运行。这种机制显著减少了传统的“Stop-The-World”停顿时间[^1]。 2. **多图映射(Multi-Mapping)**:ZGC通过将内存区域映射到多个虚拟地址空间来实现高效的内存管理。这种技术使得对象可以在不中断应用程序的情况下被移动和重新定位。 3. **三色标记法(Tri-color Marking)**:ZGC使用三色标记法进行垃圾对象的识别。具体来说: - **白色**表示未被访问的对象。 - **灰色**表示已经被发现但尚未完全处理的对象。 - **黑色**表示已经完全处理的对象。 通过这种方法,ZGC能够高效地跟踪存活对象并避免重复扫描。 4. **读屏障技术(Load Barriers)**:ZGC利用读屏障技术确保在并发过程中应用程序线程始终访问正确的对象引用。这一机制在对象指针更新时自动调整,从而保证了数据的一致性。 5. **基于区域的内存管理**:ZGC将堆内存划分为多个大小相等的区域(Region),每个区域可以独立进行垃圾回收。这种设计使得ZGC能够灵活地适应不同规模的堆内存,并且支持动态扩展[^2]。 6. **染色指针(Colored Pointers)**:ZGC通过在对象指针中嵌入额外的状态信息(如是否已标记、是否已重定位等)来简化垃圾回收过程。这种技术减少了传统垃圾回收器对额外元数据的需求,提高了效率。 --- ### ZGC垃圾回收器的使用场景 ZGC的设计目标使其特别适用于需要低延迟和高吞吐量的应用场景,具体包括: 1. **大数据处理**:在大规模数据集处理中,ZGC能够有效减少垃圾回收导致的停顿时间,从而提升整体性能。这对于实时数据分析和批处理任务尤为重要[^2]。 2. **云计算环境**:ZGC在云环境中表现出色,尤其是在多租户架构下。它能够快速响应负载变化,并保持稳定的性能表现。 3. **高并发应用**:对于需要处理大量并发请求的应用程序(如电商平台、金融交易系统等),ZGC的低延迟特性可以显著提升用户体验。 4. **大堆内存管理**:ZGC支持高达TB级别的堆内存管理,因此非常适合内存密集型应用。例如,大型缓存系统或内存数据库可以从中受益。 5. **实时系统**:在对响应时间有严格要求的实时系统中,ZGC的稳定性和可预测性使其成为理想选择。 --- ### 配置与优化建议 为了充分发挥ZGC的优势,在实际应用中需要注意以下几点: 1. **参数配置**:根据应用程序的具体需求调整ZGC相关参数,例如堆大小、区域大小以及并发线程数等。合理的配置可以显著提升性能。 2. **性能测试**:在生产环境中部署ZGC之前,应在相似的硬件和负载条件下进行充分的性能测试,以验证其适用性。 3. **监控与调优**:持续监控ZGC的运行状态,例如停顿时间、回收频率和内存使用情况,并根据监控结果进行必要的调优。 4. **资源分配**:确保系统有足够的物理内存和CPU资源来支持ZGC的并发操作,避免因资源不足导致性能下降。 --- ### 示例代码:启用ZGC的JVM参数 ```bash java -XX:+UseZGC -Xms4g -Xmx4g -jar your-application.jar ``` 上述命令启用了ZGC,并设置了初始堆大小和最大堆大小均为4GB。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值