一. 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小时的压测验证,无内存溢出问题,证明问题已解决: