一. mat内存分析

报告中NioEventLoop占用了1.2g的容量,大部分的堆空间
定位NioEventLoop正确的被引用位置应该为下图所示

NioEventLoopGroup正确的被引用位置为下图所示

但发现大量的NioEventLoopGroup没有被正确引用,却也没有回收掉

故初步定位为:NettyHttpConnectClient 下的group(io.netty.channel.nio.NioEventLoopGroup)未被正确回收
二. 排查日志
观察日志发现有大量触发器执行失败日志,原因为执行器配置ip错误

进而代码定位(通过模拟执行器无法联通的场景):

进入client.asyncSend中查看错误位置:

进入connectClient_new.init中查看错误位置,这里也是真正导致没有正确回收NioEventLoopGroup的原因:

三. 测试验证(复现问题)
本地配置一个不存在(ip对应的服务器存在,但端口不存在)的执行器,jmeter并发执行任务,约40分钟后成功复现oom问题


四. 解决方案
init发生异常后手动调用connectClient的close方法,close方法会释放group(NioEventLoopGroup):


方案经过4小时的压测验证,无内存溢出问题,证明问题已解决:


博客主要讲述了在使用Netty过程中遇到的内存溢出问题,原因是NioEventLoopGroup未被正确回收。通过日志发现执行器配置错误,导致异常并未能释放资源。在定位到问题代码后,通过在异常处理中手动调用close方法释放NioEventLoopGroup,经过压测验证解决了内存溢出问题。
1519





