Kafka Producer引发Direct ByteBuffer内存泄漏问题排查求助
Kafka Producer 内存泄漏排查问题
问题背景
服务监听MQTT通道获取测量数据,转换后发送至Kafka,整体运行正常,但存在无法定位的内存泄漏问题,内存持续增长且一周未回落。
内存监控表现
- 内存随时间呈现泄漏趋势,黄色线对应直接字节缓冲区池

- Direct ByteBuffer数量随时间持续增长,与Kafka Producer持有缓冲区数量增长趋势一致

MAT堆转储分析
大Direct ByteBuffer查询
执行OQL查询:
SELECT x AS ByteBuffer, x.capacity AS Capacity, x.limit AS Limit, x.mark AS Mark, x.position AS Position FROM java.nio.DirectByteBuffer x WHERE ((x.capacity > (1024 * 1024)) and (x.cleaner != null))
结果显示存在约400个Direct ByteBuffer,每个容量约4MB
GC根追踪
追踪GC根发现这些缓冲区被Kafka Producer持有
Kafka线程与Producer内部检查
- 执行OQL查询
select * from org.apache.kafka.common.utils.KafkaThread,得到对应线程结果
- 进一步查看Kafka Producer内部,发现其持有大量Direct ByteBuffer

Producer创建代码
@Component @RequiredArgsConstructor public class BxKafkaProducerFactory { private final KafkaProperties kafkaProperties; public <K, V> Producer<K, V> getProducer() { return new KafkaProducer<>(getKafkaProducerProperties()); } }
配置信息
几乎使用默认配置,仅自定义以下参数:
acks=alllinger.ms=100- 安全协议
SASL_PLAINTEXT - SASL机制
PLAIN - KafkaAvroSerializer作为键值序列化器
- 压缩类型
snappy
同类服务相同配置未出现该问题,服务启动仅创建3个Producer,关闭时销毁,已通过日志确认无Producer泄漏,问题倾向于Producer自身内存泄漏。
补充缓冲区GC根统计数据
15:23 Total 18: GlobalStream: 1 HearthBeat: 1 Java Thread: 1 Nio FastThread: 5 Producer 1: 1 Producer 2: 2 Producer 3: 2 Cleaner: 5 16:04 Total 23: GlobalStream: HearthBeat 1 Java Thread: 1 Nio FashThread: 6 Producer 1: 0 Producer 2: 8 Prodcuer 3: 2 Cleaner: 4 17:04 Total 25: GlobalStream: HearthBeat 2 Java Thread: 1 Nio FashThread: 7 Producer 1: 2 Producer 2: 8 Prodcuer 3: 4 Cleaner: 0
此外,使用jeprof和jemalloc分析未发现异常。
内容的提问来源于stack exchange,提问作者Taliebram
相关产品推荐
相关产品推荐

