记一次内存泄漏问题排查
现象:容器运行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在使用时, 每个任务周期结束后没有关闭, 不断累积增加
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端