龙叔运维问题排查记录java线程泄露引起OOM导致JVM Crash

Posted 龙叔运维

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了龙叔运维问题排查记录java线程泄露引起OOM导致JVM Crash相关的知识,希望对你有一定的参考价值。

就在一个风平浪静的周末,一阵手机铃声惊醒了惬意的寂静,作为运维的我,心里一凉,是的,系统告警了

一个系统出现服务实例可用性告警,很快,80多个实例就剩下20多个了

 

运维处理故障的第一要素就是先恢复,保留能保留的线索,于是先重启了进程消失的系统实例,立刻对还没挂的实例打了线程dump

 

重启后的实例没有再次出现异常,接下来就是找原因了

 

现象

进程挂了的实例  最后面都打印了下面的日志,可以看出是oom了,但是又是什么原因导致的内存不足的呢

 

然后又看了系统监控图,发现某个版本之后,线程数量就是持续递增的(第二次发版重启后降了下来,然后到现在因为没有版本,就再没有重启过,直到现在出现问题),所以可以确定是线程泄露了

 

 

排查

 

 

这里定位是比较快的,寿险看crash的实例最后打印的致命错误日志(hs_errpidXXX.log),可以看到里面是由大量的inetutils对象,基本就可以确定和inetutils类有关

 

接着我们再看看之前打的therad dump内容。对其进行统计分析,可以看到inetutils对象相关的线程多达9万多个,这就很明显是inetutils的问题了,就可以直接找开发确认inetutils代码的问题了

 

原因

最后核实到 是有个任务没分钟会创建一个inetutils对象,而inetutils对象在构造的时候就会创建一个守护线程,并且没有主动回收线程,所以自从启动之后,就每分钟创建一个线程,直到内存耗尽OOM,导致crash

开发也是最后优化了代码

 

以上是关于龙叔运维问题排查记录java线程泄露引起OOM导致JVM Crash的主要内容,如果未能解决你的问题,请参考以下文章

龙叔运维问题排查记录nginx-resolver解决动态域名解析

cgroup 内存泄露问题排查记录

内存快照排查OOM,加密时错误方法指定provider方式错误引起的OOM

分析 Go time.After 引起内存暴增 OOM 问题

记录一将内存中大量JceSecurity实例导致OOM问题排查

记录一将内存中大量JceSecurity实例导致OOM问题排查