You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kafka Producer引发Direct ByteBuffer内存泄漏问题排查求助

Kafka Producer 内存泄漏排查问题

问题背景

服务监听MQTT通道获取测量数据,转换后发送至Kafka,整体运行正常,但存在无法定位的内存泄漏问题,内存持续增长且一周未回落。

内存监控表现

  • 内存随时间呈现泄漏趋势,黄色线对应直接字节缓冲区池
    内存随时间泄漏趋势
  • Direct ByteBuffer数量随时间持续增长,与Kafka Producer持有缓冲区数量增长趋势一致
    Direct ByteBuffer增长情况

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
OQL查询结果

GC根追踪

追踪GC根发现这些缓冲区被Kafka Producer持有
GC根信息

Kafka线程与Producer内部检查

  • 执行OQL查询select * from org.apache.kafka.common.utils.KafkaThread,得到对应线程结果
    Kafka线程查询结果
  • 进一步查看Kafka Producer内部,发现其持有大量Direct ByteBuffer
    Kafka线程展开内容

Producer创建代码

@Component
@RequiredArgsConstructor
public class BxKafkaProducerFactory {

    private final KafkaProperties kafkaProperties;

    public <K, V> Producer<K, V> getProducer() {
        return new KafkaProducer<>(getKafkaProducerProperties());
    }
}

配置信息

几乎使用默认配置,仅自定义以下参数:

  • acks=all
  • linger.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:53:31