记一次内存泄漏问题排查
现象:容器运行1-2小时后,内存逐渐上升到100%,主进程被os kill, 随后容器被重新拉起, 内存再次上升...
配置信息, 容器设置的最大内存8G
分析过程:
1. jinfo pid打印出进程的配置信息, 进程堆内存设置为4G
2. jmap -heap pid 打印出堆内内存情况
jmap -histo:live pid > tmp.txt 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量
堆内存没有泄漏问题, 其实堆内存泄漏一般是OOM错误, 而不是容器被kill
3.查看堆外内存占用
jcmd pid VM.native_memory summary scale=MB
https://kukudi.blog.csdn.net/article/details/107395061
发现堆外内存中,thread随着时间增加数量从最初的100到2500多, 而每个线程占用1Mb栈内存, 该部分内存占用的是堆外内存
初步确定是线程个数不断上升导致内存泄漏
使用命令jstack pid > tmp.txt, 发现ssh线程数居多, 最后发现是ftp在使用时, 每个任务周期结束后没有关闭, 不断累积增加