【Netty源码解读和权威指南】第64篇:Netty生产问题排查——OOM/CPU飙高/连接泄漏全解析
2026/6/25 22:28:48 网站建设 项目流程

上一篇【第63篇】Netty压测与性能基准——Wrk/JMH实战测量吞吐量
下一篇【第65篇】Netty优雅降级与熔断——高可用Netty服务的容错设计


一、OOM排查

# 1. 确认是否堆外OOMjcmd<pid>VM.native_memory summary# 查看Direct Memory使用# 2. 开启泄漏检测-Dio.netty.leakDetection.level=PARANOID# 3. 常见泄漏场景ctx.writeAndFlush(buf);// ❌ write后buf未release buf.retain();// ❌ retain后忘记release

排查技巧

// 使用ResourceLeakDetector追踪ResourceLeakDetector.setLevel(PARANOID);// 日志会有:LEAK: ByteBuf.release() was not called...// Recent access records:// #1: com.example.MyHandler.channelRead(MyHandler.java:23)

二、CPU飙高排查

# 1. 找到CPU高的线程top-H-p<pid># 2. 转16进制printf"%x\n"<tid># 3. jstack查看该线程jstack<pid>|grep-A20<hex_tid>

常见原因

  1. NioEventLoop死循环:epoll空轮询Bug →rebuildSelector()
  2. 用户代码死循环:Handler中的while(true)
  3. 时间轮任务堆积:大量延时任务未执行

三、连接泄漏排查

# 查看连接数netstat-an|grep<port>|wc-l# 查看CLOSE_WAIT状态netstat-an|grepCLOSE_WAIT|wc-l
// 监控连接数privatestaticfinalAtomicIntegerconnections=newAtomicInteger();channelActive:connections.incrementAndGet();channelInactive:connections.decrementAndGet();// 定期打印连接数eventLoop.scheduleAtFixedRate(()->{System.out.println("Connections: "+connections.get());},10,10,SECONDS);

四、应急止损

# 1. 限流(临时关闭新连接)# 2. 重启(优雅关闭→启动)# 3. 扩大连接池# 暂时禁用泄漏检测-Dio.netty.leakDetection.level=DISABLED

上一篇【第63篇】Netty压测与性能基准——Wrk/JMH实战测量吞吐量
下一篇【第65篇】Netty优雅降级与熔断——高可用Netty服务的容错设计


需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询