用jvisualvm分析dump文件

本文介绍了一次Java服务堆内存溢出的问题处理过程。通过使用jmap命令生成dump文件并利用jvisualvm工具进行详细分析,揭示了内存溢出的具体原因及dump文件所反映的真实情况。

最近有一个java服务的堆内存溢出,然后僵死了,在重启服务之前用jmap命令生成了一份dump文件便于后面分析。

生成dump文件的命令:

jmap -dump:format=b,file=20170307.dump 16048

file后面的是自定义的文件名,最后的数字是进程的pid。


使用jvisualvm来分析dump文件:

jvisualvm是JDK自带的Java性能分析工具,在JDK的bin目录下,文件名就叫jvisualvm.exe。

jvisualvm可以监控本地、远程的java进程,实时查看进程的cpu、堆、线程等参数,对java进程生成dump文件,并对dump文件进行分析。

像我这种从服务器上dump下来文件也可以直接扔给jvisualvm来分析。

使用方式:直接双击打开jvisualvm.exe,点击文件->装入,在文件类型那一栏选择堆,选择要分析的dump文件,打开。





装入之后在界面右侧的概要、类等选项卡可以看到生成dump文件当时的堆信息:




可以看到,dump文件里记录的堆中的实例,总大小大概300M左右,(用第一行的实例大小除以百分比就能算出来),和JVM默认的新生代的大小差不多,远小于JVM中设置的最大堆内存,也就是说,dump文件里记录的并不是实例大小达到最大堆内存时的状态。


为了验证一下,我自己在本地模拟了一下堆内存溢出的情形,并用jvisualvm监控

我本地设置的最大堆内存是800M左右,代码里面是往一个List里面疯狂加数据,直到撑爆堆内存,得到的监控内容是这样的:


分析:红框框出的部分是发生堆内存溢出时的情形,已使用的堆大小(蓝色部分)并没有增长特别明显,但是申请的堆的大小(黄色部分)从默认的400多兆急速上涨,涨到800M,然后内存溢出,然而使用的堆大小依然没怎么增长。

所以,dump文件中的实例列表其实是反映了使用的堆的情况,而使用的堆内存并没有达到预先设置的最大堆内存,只是在申请堆内存的过程中超出了预先设置的最大堆内存,然后内存溢出。


最后,jvisualvm确实挺好用的。

### 三级标题:使用 VisualVM 分析 Java Dump 文件 VisualVM 是一款集成了多个 JDK 命令行工具的可视化性能分析工具,支持内存、线程、CPU 使用情况的监控,并能够加载和分析dumpheap dump文件,帮助排查内存泄漏、线程死锁等问题[^1]。 #### 加载堆 dump 文件 VisualVM 可以直接加载 `.hprof` 格式的堆 dump 文件,用于分析内存使用情况和查找内存泄漏的根源。操作步骤如下: 1. 启动 VisualVM(路径通常为 `$JAVA_HOME/bin/jvisualvm.exe`)。 2. 在菜单栏中选择 **File > Load**,选择需要分析的 `.hprof` 文件。 3. 文件加载完成后,主界面会显示堆内存中的类、实例和内存分布情况。 在 **Classes** 标签页中,可以查看各个类的实例数量和内存占用情况,有助于识别是否存在异常的对象增长。在 **Instances** 标签页中,可以查看具体对象的实例信息及其引用链[^3]。 #### 分析内存泄漏 VisualVM 提供了多个视图用于分析内存泄漏问题: - **GC Roots**:通过查看对象的 GC Roots 引用链,判断是否存在未释放的引用导致对象无法被回收。 - **Dominator Tree**:显示内存中占据主导地位的对象,有助于快速识别内存瓶颈。 - **OQL 控制台**:支持使用面向对象的查询语言查找特定对象,例如查询某个类的所有实例: ```java select s from java.lang.String s where s.count > 100 ``` #### 分析线程 dump 文件 虽然 VisualVM 主要用于堆 dump 分析,但也可以通过插件或结合其他工具(如 `jstack`)来分析线程 dump 文件。线程 dump 文件通常以文本形式记录了 JVM 中所有线程的状态和调用栈信息,适用于排查线程死锁、资源竞争等问题。 使用 `jstack` 生成线程 dump 的命令如下: ```bash jstack <pid> > thread_dump.txt ``` 在 VisualVM 中,可以通过 **Threads** 标签页实时监控线程状态,查看线程的调用栈和锁信息。对于已有的线程 dump 文件,可以使用文本编辑器或专门的分析工具进行查看和分析[^2]。 #### 配置 JVM 自动生成堆 dump 为了在发生 `OutOfMemoryError` 时自动生成堆 dump 文件,可以在 JVM 启动参数中添加以下配置: ```bash -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heap_dump.hprof ``` 这一配置确保在内存溢出时保留完整的内存快照,为后续分析提供关键数据[^4]。 #### 示例:使用 VisualVM 分析dump 假设已生成名为 `heap_dump.hprof` 的堆 dump 文件,打开 VisualVM 并加载该文件后,切换到 **Classes** 或 **Dominator Tree** 视图,可以查看内存中各对象的分布情况。选择某个类后,右键点击 **Show Objects by Class**,可查看该类的所有实例及其引用链。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值