使用jdk自带的VisualVM分析hprof堆转储文件

使用jdk自带的VisualVM分析hprof堆转储文件

            <div id="content_views" class="markdown_views prism-atom-one-dark">
                <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                    <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                </svg>
                <h3><a name="t0"></a><a id="_3"></a>一、堆转储文件</h3> 

堆转储文件(heap dump):是JVM 的某个时间点、Java 进程的内存快照。里面包含了当时内存中还没有被 full GC 回收的所有对象和类信息。

二、手动生成堆转储文件的命令

  jmap -dump:format=b,file=<filename.hprof> <pid>

 
  • 1

这将生成一个hprof后缀的文件,其中:

  • format=b,表示转储为二进制格式。
  • file 指定转储文件的路径,后缀为 hprof。
  • pid 表示进程 ID。

三、自动生成堆转储文件

JVM 中配置如下

 -XX:+HeapDumpOnOutOfMemoryError

 
  • 1

内存溢出时就会记录异常到堆转储文件

四、VisualVM分析hprof堆转储文件

可以使用 jdk 自带的VisualVM工具来进行分析(jdk高于1.8或1.8晚期的 jdk 已经没有自带了,可以去 VisualVM官网下载安装

1.java安装目录下的bin目录下双击打开 jvisualvm.exe
在这里插入图片描述
2.选择文件点击装入,然后加载要分析的hprof文件
在这里插入图片描述
在这里插入图片描述

3.选择类,然后对堆内存大小进行排序,双击可以查看具体类型的实例内存占用情况
在这里插入图片描述

4.双击具体的实例可以查看该实例的内容和占用的大小,可以选择全部展示或者把该内容保存为一个txt文件
在这里插入图片描述

原文链接:https://blog.csdn.net/qq_33697094/article/details/126350977
<think>好的,用户想用JVisualVM分析JVM的堆转储文件,也就是.hprof格式的文件。我之前已经给出过步骤,但用户现在再次询问,可能需要更详细的指导。首先,我需要确认用户是否已经生成了堆转储文件,或者是否需要先说明生成方法。根据引用[1],用户可能已经通过jmap、JConsole或JVisualVM生成了文件,现在重点是如何分析。用户的问题明确指向使用JVisualVM进行分析,所以需要详细步骤。之前的回答中提到了加载堆转储、查看类标签页、使用OQL查询等。可能需要分步骤详细说明,包括如何启动JVisualVM,如何装入文件,各个功能模块的作用,比如内存摘要、实例数排序,以及如何检查引用链。另外,引用[2]提到堆转储文件可能很大,需要注意内存分配,但用户的问题是关于JVisualVM使用,所以可能需要提醒用户如果文件过大,JVisualVM可能会较慢,或者建议增加内存。不过用户的问题重点在分析步骤,可能暂时不需要优化方面的内容,但可以放在注意事项里。用户之前的回答中提到了使用jhat和jvisualvm的对比,这里需要专注于JVisualVM的操作。可能需要补充截图或示例,但文本形式只能描述步骤。需要确保每个步骤清晰,比如如何打开文件,导航到各个标签页,如何查看对象实例,执行OQL查询等。 还要注意引用文献,用户提供的引用[1]提到JVisualVM和MAT都可以分析,引用[2]提到Android Studio和其他工具,但用户明确要JVisualVM,所以重点在引用[1]的内容。需要确保在回答中正确标注引用,比如生成堆转储的部分引用[1],大文件的问题引用[2]。可能还需要考虑用户的实际操作中可能遇到的问题,比如如何安装VisualGC插件,这在之前的相关问题中提到过,但用户当前的问题可能不需要,但可以放在相关问题里。此外,用户可能需要知道如何查看对象的引用关系,以诊断内存泄漏,这部分需要详细说明。最后,生成相关问题,需要基于当前内容,比如如何安装插件、处理大文件、OQL使用等。确保问题与当前主题相关,帮助用户深入探索。</think>### 如何用 JVisualVM 分析 JVM 堆转储文件 (.hprof 格式) #### 一、启动 JVisualVM 1. **打开工具** - JVisualVMJDK 自带工具,直接通过命令行启动: ```bash jvisualvm ``` - 若 PATH 环境变量未配置,需进入 JDK 安装目录的 `bin` 文件夹下执行[^1]。 --- #### 二、加载堆转储文件 1. **导入文件** - 点击菜单栏的 **文件 → 装入**,选择 `.hprof` 文件(支持本地或远程文件)。 - 若文件过大(如 GB 级别),需确保 JVisualVM 分配足够内存(可修改 `visualvm.conf` 中的 `-J-Xmx` 参数)[^2]。 --- #### 三、核心分析功能 1. **查看堆内存摘要** - **摘要视图**:显示堆内存总量、对象总数、类总数等全局信息。 - **关键指标**:关注 `char[]`、`String` 等高频类,若其占用比例异常(如超过 30%),可能是内存泄漏的信号[^1]。 2. **分析对象分布** - **类标签页**: - 按 **实例数** 或 **大小** 排序,快速定位内存消耗高的类。 - 示例:若 `HashMap$Node` 实例数异常增长,需检查是否因未清理缓存导致[^1]。 - **实例视图**: - 双击具体类(如 `java.lang.String`),查看所有实例的字段值与内存地址。 3. **追踪引用链** - **右键实例 → 在实例视图中显示**:查看该实例的 **入引用**(被谁持有)和 **出引用**(持有谁)。 - 示例:若某个 `Thread` 实例长期存活且持有大量对象,可能是线程池未正确关闭导致[^1]。 4. **执行 OQL 查询** - **OQL 控制台**:输入类 SQL 语句筛选特定对象。 ```sql SELECT s FROM java.lang.String s WHERE s.value.length > 1000 ``` 用于查找长度超过 1000 的字符串[^1]。 --- #### 四、典型内存泄漏分析流程 1. **定位异常类** - 在 **类标签页** 中按大小排序,假设发现 `byte[]` 占用 80% 内存。 2. **查看实例详情** - 双击 `byte[]`,检查其实例的 `Retained Size`(对象实际占用的内存,含引用链下游对象)。 3. **分析引用链** - 选择一个巨型 `byte[]` 实例,查看其被哪个 `ClassLoader` 或静态变量持有。 4. **结合代码修复** - 若发现 `byte[]` 被缓存类 `GlobalCache` 持有且未释放,需优化缓存淘汰策略[^1]。 --- #### 五、注意事项 1. **性能优化** - 堆转储文件过大时,JVisualVM 解析可能较慢,建议: - 增加 JVisualVM 内存(修改 `visualvm.conf` 中的 `-J-Xmx8g`)[^2]。 - 使用命令行工具 `jmap -histo <pid>` 快速获取类分布直方图[^1]。 2. **插件增强** - 安装 **Visual GC** 插件: - 菜单栏选择 **工具 → 插件 → 可用插件**,勾选 `Visual GC` 并安装,可实时监控堆内存与 GC 行为[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值