必须使用-XX:+UseG1GC启动Kafka Broker,大堆下CMS已废弃、Parallel GC不支持暂停控制;-XX:MaxGCPauseMillis推荐20起调,严禁小于10;-XX:G1HeapRegionSize需匹配消息大小,建议2M或4M;-Xms与-Xmx必须相等;禁用-Xmn和-XX:NewRatio。

必须用 -XX:+UseG1GC 启动 Kafka Broker
不用 G1,Kafka 在大堆(≥6GB)下极易出现秒级 GC 停顿,直接拖垮端到端延迟。CMS 已被 JDK 9+ 废弃,Parallel GC 不支持暂停时间目标控制,-XX:+UseG1GC 是唯一合理选择。启动脚本 kafka-server-start.sh 中必须显式启用,不能依赖 JDK 默认(JDK 9+ 虽默认 G1,但 Kafka 运行环境常为 JDK 8,需手动指定)。
-XX:MaxGCPauseMillis 设多少才不翻车
这个参数是软目标,不是硬上限。设太小(如 50)会导致 G1 频繁触发 Young GC、回收 Region 过多,反而吞吐暴跌;设太大(如 1000)又失去低延迟意义。生产环境推荐从 20 开始压测:
- 32GB 堆配
-XX:MaxGCPauseMillis=20是多数高吞吐 Kafka 集群的起点 - 若观察到 GC 频率突增(
jstat -gc <pid></pid>中GCT持续上升),可放宽至50 - 严禁设
:G1 无法在毫秒级内完成跨 Region 扫描和引用处理,会退化为更激进的并发策略,反而增加停顿
堆大小与 -XX:G1HeapRegionSize 必须匹配
Kafka 处理大量消息体时,容易产生 Humongous Object(巨型对象)。一旦单条消息 > RegionSize/2,就会被直接分配进 Humongous 区——这类对象只能在 Full GC 或混合回收中清理,极易触发 “too many humongous allocations” 报错。
- 默认
RegionSize是 1MB~4MB(由堆大小自动推导),对 Kafka 日志段(默认 1GB)或大消息不友好 - 若平均消息体 ≥ 512KB,建议显式设
-XX:G1HeapRegionSize=2M或4M - 同时确保
-Xms和-Xmx相等(如-Xms16G -Xmx16G),避免堆动态伸缩干扰 Region 分布
别碰年轻代相关参数,G1 会自己调
很多调优文档还教人设 -Xmn 或 -XX:NewRatio,这对 G1 是危险操作:
-
-Xmn会锁死年轻代大小,使 G1 无法根据-XX:MaxGCPauseMillis动态调整 Eden/Survivor 比例 -
-XX:NewRatio在 G1 中完全无效,JVM 会忽略并打印警告 - 真正该开的是
-XX:+PrintAdaptiveSizePolicy,用于确认 G1 是否在按需扩缩年轻代
最易被忽略的一点:G1 的 Region 划分在 JVM 启动时就固定了,后续无法更改。如果堆大小或 G1HeapRegionSize 设错,必须重启 Broker 才生效——线上不敢轻易动。


















