背景:
项目在一次转测的之后,没过多久调用接口响应时间明显增长,甚至出现接口超时。
在测试服务器上使用top命令查看发现,cpu持续飙升至300%,且内存近乎满负荷。重启
tomcat之后情况还是得不到缓解。怀疑发生内存泄漏,或者是代码中有死循环;
排查步骤:
1、登录到测试服务器上,使用jps 查看jvm进程号<pid>;
2、使用命令jmap -dump:format=b,file=heap.bin <pid>生成jvm内存dump文件;
3、将dump文件下载下来,使用配置较高的计算机解析dump文件。使用jdk自带的工具jhat或者其他工具也行,jhat -J-Xmx512m heap.bin
-Xmx512m 是设置jvm堆内存大小,如果dump文件比较大就设置大一点
当命令行提示:Snapshot resolved.Started HTTP server on port xxx
4、按照命令行的提示,访问该端口,会进入到web页面,点下面那个show instance count for all classes 可以查看当时jvm里面对象对应的class,查看异常对象,可以分析出发生泄漏的位置;
5、使用专业的内存分析工具,MAT等可以查看对象之间的引用关系,能更加准确的确定发生泄漏的位置。
记一次内存泄漏的排查方案
最新推荐文章于 2023-04-25 14:40:18 发布