记一次内存泄漏问题排查

现象:容器运行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在使用时, 每个任务周期结束后没有关闭, 不断累积增加

 

posted @ 2021-02-06 12:33  車輪の唄  阅读(11)  评论(0编辑  收藏  举报  来源