1、产生原因申请的ByteBuf没release
// 申请分配ByteBuf
ByteBuf buffer = ctx.alloc().buffer();
// 释放buf方式1
buffer.release();
// 释放buf方式2
ReferenceCountUtil.release(buffer);
- 堆外:未free
- 堆内:未归还
最终导致OOM
netty检测内存泄漏的核心:引用计数器(buffer.refCnt())+弱引用DefaultResourceLeak(WeakReference)
ResourceLeakDetector(内存泄露检测工具类)
new ByteBuf时会调用此方法
1.1、内存泄露检测工具检测
- 设置启动参数:-Dio.netty.leakDetection.level=PARANOID
- 前置条件
- 默认级别SIMPLE,不是每次都检查
- GC后,才有可能检测到
- 注意日志级别,必须开启error
- 上线前最高级别,上线后用默认