327 字
2 分钟
JVM内存不断增长的处理过程
问题情况:
最近接到一个旧的项目维护,同事说有个奇怪的Bug就是该项目每运行几天就会导致定时任务无法执行,需要重启才行。 然后反应的内存问题是从启动时的3-4G一路增长到8G多。
解决思路:
接手的第一反应可能是什么地方的代码导致了内存泄漏?
通过下面的命令查看jvm的gc情况,发现内存是正常的 jstats gcutil
保险起见,又使用 jmap -heap pid
查看了堆内存的占比,感觉没啥问题。
这个时候就奇了怪了,堆内存一切正常,那对外内存使用情况呢?
通过开始内存详情查看 jcmd pid VM.native_memory detail scale=MB
发现thread占用超出的正常范围,动不动就是1G以上。
这个时候就找到问题点了,jvm线程使用异常
掏出arthas的jvm命令,惊奇的发现,thread中的线程数量居然有1200+。随着观察的时间越久,这个数量还会继续增加。
寻找项目代码中的线程使用地方,有个位置在不断的开销新的线程,而原先的线程并没有让其终止执行。
修复该BUG,重新部署。解决!!!