`
wangmengbk
  • 浏览: 288806 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

    博客分类:
  • J2EE
 
阅读更多

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

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

 

 


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



 

gc执行情况:




 在执行过程中 是用vmstat 命令查看r值,r值等待执行的线程比较高,如下图:




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



  

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

vmstat 效果:



 gc 执行效果:



 

 

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

具体原因:

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

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

  

  • 大小: 371.3 KB
  • 大小: 707.8 KB
  • 大小: 92.5 KB
  • 大小: 36.5 KB
  • 大小: 151.5 KB
  • 大小: 112.2 KB
  • 大小: 92.5 KB
  • 大小: 115.4 KB
  • 大小: 62.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics