(1) 某次线上服务3台机器全部宕机,查看日志及监控发现,oom异常 (2) 赶紧登录服务器,做了一次线上heap dump *** 作,保留快照文件,以便后续分析问题 ① 进入docker容器,docker exec -it xxxx sh ② 执行jps,查看服务进程 jps, ③ 开始做dump文件: jmap -dump:format=b,file=heap.2021-12-28.hprof2. 排查过程④ 至此,线上快照完毕,导出到本地机器,准备做分析使用
1) 我采用的是memory analyzer 分析工具,功能很强大. ① mat下载工具: http://www.eclipse.org/downloads/download.php?file=/mat/1.12.0/rcp/MemoryAnalyzer-1.12.0.20210602-macosx.cocoa.x86_64.dmg ② 我用的是高版本,需要jdk11及以上,顺便我将电脑的jdk1.8 升级到了11, ③ 工具准备就绪,可以开始分析了. 2) 打开mat分析工具 ① 菜单栏选择,File -> open File 选择要分析的hprof文件. ② 打开分析文件的时候,一定要选择上leak suspects report 功能,这个功能有助于协助分析问题点所在,对我们是个很好的提示
③ 可以看到报告,显示 org.apache.coyote.http11.Http11OutputBuffer 占用了大量的内存空间,猜测是不这个类做了啥 *** 作?
- 点击dominator tree 查看任务依赖树,发现都是一些接口调用记录.
- 发现单个对象的大小都为10M,猜测?是不应用哪个地方加了配置,给http请求设置了内存预分配
- 百度,发现 跟application.yml 配置中 max-http-header-size: 10000000 设置有关,果断去掉此配置,重新弄部署上线,运行正常,监控应用老年代内存一直处于正常状态.
1) 查看对象实例数及内存容量占比.
2) 查看依赖树.
3) 查看对象堆栈信息.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)