CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出

阅读更多

在高并发压测过程中发现连接数超过 22000,在运行过程出现 堆溢出,并同样生成了dump.hprof 快照文件。

通过IMB heapAnalyzer 分析发现 程序中某个对象过多。

 
CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第1张图片
 


通过程序优化后该现象没有了,不过有新的出现 netty 中的 nioEventLoop对象 以及该对象下的 SchedukedFutureTask 任务大量积压 同样造成了内存溢出,同时伴有 CPU 100% 一直进行 fullGC,效果如下图:


CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第2张图片
 

gc执行情况:



CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第3张图片
 在执行过程中 是用vmstat 命令查看r值,r值等待执行的线程比较高,如下图:




CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第4张图片

查看占用CPU最高的5个线程结果 都在执行fullgc 效果图如下:


CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第5张图片
  

通过对业务代码 的分析发现用户在netty中使用IdleStateHandler用于在链路空闲时进行业务逻辑处理,但是空闲时间设置的比较大,为5分钟.通过优化为 30秒后,该现象没有出现。并且执行效果也明显提升。

vmstat 效果:


CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第6张图片
 gc 执行效果:


CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第7张图片
 
CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第8张图片
 

通过以上完美解决该问题。

具体原因:

Netty的IdleStateHandler会根据用户的使用场景,启动三类定时任务,分别是:ReaderIdleTimeoutTask、WriterIdleTimeoutTask和AllIdleTimeoutTask,它们都会被加入到NioEventLoop的Task队列中被调度和执行。

由于超时时间过长,10k个链接会创建10k个ScheduledFutureTask对象,每个对象还保存有业务的成员变量,非常消耗内存。用户的持久代设置的比较大,一些定时任务被老化到持久代中,没有被JVM垃圾回收掉,内存一直在增长,存在内存泄露。

  

  • CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第9张图片
  • 大小: 371.3 KB
  • CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第10张图片
  • 大小: 707.8 KB
  • CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第11张图片
  • 大小: 92.5 KB
  • CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第12张图片
  • 大小: 36.5 KB
  • CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第13张图片
  • 大小: 151.5 KB
  • CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第14张图片
  • 大小: 112.2 KB
  • CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第15张图片
  • 大小: 92.5 KB
  • CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第16张图片
  • 大小: 115.4 KB
  • CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出_第17张图片
  • 大小: 62.7 KB
  • 查看图片附件

你可能感兴趣的:(CPU高占用100% 以及Netty中的NioEventLoop对象下的 SchedukedFutureTask 造成内存溢出)