Cassandra切换ZGC后随机出现JVM OOM重启问题求助
Cassandra切换ZGC后写入阶段随机OOM重启问题求助
近期将Cassandra的垃圾回收器从G1GC切换为基于JDK 11的ZGC,P99延迟得到大幅提升,但在写入操作期间,部分节点会随机因JVM OOM(内存溢出)而重启,当前CPU使用率低于50%,寻求有ZGC使用经验的人士提供解决方案。
相关配置信息
- 最大堆内存:38 GB
- 最大直接内存:38 GB
- 物理内存:125 GB
- CPU核心数:32
- concurrent_reads:32
JVM配置参数
JVM_OPTS="$JVM_OPTS -XX:+UnlockExperimentalVMOptions" JVM_OPTS="$JVM_OPTS -XX:+UseZGC" JVM_OPTS="$JVM_OPTS -XX:ConcGCThreads=16" JVM_OPTS="$JVM_OPTS -XX:ParallelGCThreads=16" JVM_OPTS="$JVM_OPTS -XX:MaxTenuringThreshold=9" JVM_OPTS="$JVM_OPTS -XX:MaxGCPauseMillis=500" JVM_OPTS="$JVM_OPTS -XX:G1RSetUpdatingPauseTimePercent=5" JVM_OPTS="$JVM_OPTS -XX:InitiatingHeapOccupancyPercent=25"
JVM错误日志
A fatal error has been detected by the Java Runtime Environment: SIGSEGV (0xb) at pc=0x00007f077cd64df4, pid=2341073, tid=2342488 JRE version: OpenJDK Runtime Environment (Red_Hat-11.0.22.0.7-1) (11.0.22+7) (build 11.0.22+7-LTS) Java VM: OpenJDK 64-Bit Server VM (Red_Hat-11.0.22.0.7-1) (11.0.22+7-LTS, mixed mode, tiered, z gc, linux-amd64) Problematic frame: V [libjvm.so+0xbf4df4] Node::rematerialize() const+0x4
解决方案建议
- 移除G1GC专属参数:配置中的
-XX:G1RSetUpdatingPauseTimePercent=5是G1GC独有的参数,ZGC不支持,保留会导致无效配置甚至潜在冲突,直接删除该参数。 - 调整ZGC并发线程数:
ConcGCThreads=16对于32核CPU来说过高,ZGC推荐并发线程数为CPU核心数的1/4~1/2,建议改为-XX:ConcGCThreads=8,减少GC线程对系统资源的占用,降低内存管理压力。 - 压缩直接内存配置:当前堆内存+直接内存合计76GB,ZGC自身还需要额外内存(如标记位图、页表等),过大的直接内存可能导致系统可用内存不足触发OOM。建议将最大直接内存调整为20GB,添加参数
-XX:MaxDirectMemorySize=20G。 - 升级JDK版本:你使用的OpenJDK 11.0.22存在ZGC相关的已知Bug,比如日志中出现的
Node::rematerialize()段错误,升级到JDK 11的最新补丁版本(如11.0.25+)或JDK 17(ZGC在该版本中更成熟)可修复此类底层问题。 - 固定堆内存大小:给JVM添加
-Xms38G参数,让堆内存初始值与最大值一致,避免JVM动态调整堆大小带来的额外开销,ZGC对固定大小堆的处理效率更高。 - 调整GC触发阈值:
InitiatingHeapOccupancyPercent=25设置过低会导致GC过于频繁,增加内存波动风险,建议调整到40~50,减少GC触发次数。
内容的提问来源于stack exchange,提问作者user21080539
相关产品推荐
相关产品推荐

