MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

如何使用jmap分析内存泄漏OOM问题

2025-03-19 13:08 huorong 精选文章 4 ℃ 0 评论

一、Dump的基本概念

在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题。这些文件记录了JVM运行期间的内存占用、线程执行等情况,这就是我们常说的dump文件。

常用的有heap dump和thread dump(也叫javacore,或java dump)。我们可以这么理解:heap dump记录内存信息的,thread dump是记录CPU信息的;

二、压测过程中内存问题分析常用步骤

1、使用 free -m 命令查看内存使用情况,判断内存使用占比是否过高

2、使用jstat -gc pid 命令查看GC回收情况,判断是否存在full GC频繁

3、使用jmap命令生成head dump文件

jmap -dump:live,format=b,file=xxxx.hprofile pid

4、使用VisualVM或MAT工具分析dump文件,找到具体泄露的对象

三、jmap命令实战演示

1、free -m 查看内存使用情况,top命令查看进程PID:

2、使用jmap命令导出head dump文件:

jmap -dump:live,format=b,file=m.hprofile6534 6534

其中:m.hprofile6534是dump信息导出的文件名称,6534是进程号

3、使用JDK自带的VisualVM工具分析:

本地JDK安装目录》bin目录下找到jvisualvm.exe, 双加打开:

加载下载的head dump文件:

如果是有OOM的现象,这里会多一段显示,点击可以查看具体异常信息,帮助定位OOM的原因:

点击“类”可以查看对象类型,实例数占比,实例数个数、实例所占用内存大小从高到低排序,哪种类型的对象占用了内存最多一目了然:

如果某种类型的对象太多,那么有可能是引用它的那个类的对象太多,结合原代码,就可以初步定位内存泄漏的地方。

4、也可以使用工具:MAT ( Eclipse Memory Analyzer)做更深入详细的分析

  • 下载MAT;
  • 使用MAT打开head dump文件;
  • 直接查看Report区域下Leak Suspects, MAT给出可能的内存泄露原因:

Action区域下Histogram可以查看分析哪些类型的对象占用的内存比较多(没有得到及时GC):

在对象上右键,菜单中可以选择show objects by class查看更详细的信息用于分析:

=================================
以上就是本次的全部内容,如果对你有帮助,欢迎关注我的微信公众号:
程序员杨叔,各类文章都会第一时间在上面发布,持续分享全栈测试知识干货,你的支持就是作者更新最大的动力~

Tags:jmap

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言