如何分析OOM文件

一、下载dump文件。
需联系运维同事获取dump文件。dump文件的生成,需在jvm启动时通过添加启动参数:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=。因此直接到设置的目录文件下下载下来即可。后缀名一般为hprof。有些为dump后缀,改为hprof一样是可用的。

二、下载MAT工具。
本文分析oom文件需要借助MAT工具。MAT全名是Memory Analyzer,即分析JVM内存的工具。MAT实际是一个eclipse插件,在使用时还需下载eclipse.下载时可到这个地址下载:http://www.eclipse.org/mat/downloads.php,这里已经把MAT和eclipse都集成到一起了,所以很方便使用,推荐下载。

三、打开dump文件
打开eclipse后,直接将hprof文件拖到eclipse的工作区中。eclipse会自动打开这个文件,大约花费2到3分钟的时间,请耐心等待。打开后会看到下图所示的一个分析视图概览:饼状图显示的是内存中各对象的内存占比,最大的那块就是内存中占用空间最大的对象,把指标移到上面可以看出具体是哪个对象。但是因为我们自定义类大都使用包装类,比如String,Interger,故这里最大的对象,一般也是这些包装类,因此一般来说此图分析用途不大。
四、分析dump文件
1、找到上图Actions标签栏下的Dominator Tree
这个是我们本次分析的重点。dominator tree翻译是支配树,通过它能够找到对象之间的依赖关系。如下图所示。打开时就已经按照占用内存大小对对象进行了排序。排在最前面的就是占用内存最大的对象,这里实际就是上面饼状图的另一种表示。
在这里插入图片描述
2、找到org.apache.tomcat.util.threads.TaskThread
从过往分析的几个oom文件来看,TaskThread这个对象基本都是排前面几个的,因此比较好找。然后右键找到java Basics → Thread Details,如下图所示
在这里插入图片描述
3、查看TaskThread对象的线程栈
这里为啥找TaskThread对象,个人想法是,每个请求进来都是通过一个线程来进行处理的,故后续业务逻辑生成的对象多少会跟此对象有关联,因此可以把这个对象理解为业务处理的源头,通过分析它的线程栈,就可以找到出问题的方法。如下图所示,我们公司的代码都是com.to8to的前缀,根据这个应该很快就能找到我们要找的接口,这个接口就是产生大量对象的有问题的接口。接下来就需要结合具体业务进一步分析。
在这里插入图片描述

### 使用 JVisualVM 分析 HPROF 文件解决 Java OOM 问题 #### 准备工作 为了能够顺利使用 JVisualVM 进行分析,需确保 JDK 已经正确安装,并且 `jvisualvm` 可执行文件位于环境变量 PATH 中以便于命令行调用。对于特定版本的 JDK 如 jdk1.8.0_102, 路径应为 `Java/jdk1.8.0_102/bin/jvisualvm.exe`[^1]。 #### 创建触发 OOM 的测试代码 编写一段简单的 Java 应用程序来模拟内存泄漏的情况是非常有帮助的。下面是一个示例 REST 控制器的方法片段,它不断地向列表中添加对象直到达到预设条件为止: ```java @RequestMapping("/triggerOOM") public String triggerOOM() { List<Object> list = new ArrayList<>(); int i = 0; while (true) { oomMap.put(String.valueOf(i), new User("111")); System.out.println("oom" + i); i++; if (i == 1000000) { return "end"; } } } ``` 这段代码会在服务器接收到 `/triggerOOM` 请求时无限循环创建新对象并存储至集合内,最终导致 JVM 报告 OutOfMemoryError 错误[^2]。 #### 启动 VisualVM 并连接应用进程 一旦应用程序启动完成,在本地计算机上可以通过命令提示符输入 `jvisualvm` 来启动工具;如果已设置好 PATH,则该指令可以直接运行而无需指定完整路径。随后将会显示一个图形界面允许用户选择目标 Java 进程进行监控和性能剖析[^3]。 #### 获取 Heap Dump 文件 当怀疑存在内存泄露或其他形式的 OOM 问题时,可以从正在运行的应用进程中获取 heap dump 数据用于后续离线分析。这通常是在遇到异常情况之前手动操作或是配置 JVM 参数让其自动捕获堆转储信息。在线上的生产环境中,更常见的是事先准备好 hprof 格式的堆快照文件供下载分析[^4]。 #### 加载与解析 HPROF 文件 在获得 .hprof 文件之后,返回到 JVisualVM 主界面上点击“加载”按钮并将上述文件导入进来。此时可以查看不同视图下的数据分布状况,特别是关注 “Classes” 面板中的实例数量变化趋势以及占用空间较大的类名等细节。通过对这些信息深入挖掘往往能找到造成内存溢出的根本原因所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值