JVM学习(三)---heapDump导出与案例分析

本文介绍了JVM中heapdump和threaddump的作用及应用场景,包括如何生成heapdump文件及利用工具进行分析的方法,同时也讨论了Full GC和Stop-The-World机制的影响。

在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题。这些文件记录了JVM运行期间的内存占用、线程执行等情况,这就是我们常说的dump文件。常用的有heap dump和thread dump(也叫javacore,或java dump)。我们可以这么理解:heap dump记录内存信息的,thread dump是记录CPU信息的。

heap dump:

        heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap Analyzer工具通过分析HeapDump文件,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。

 JVM Heap Dump导出几种方式:

  1、设置启动的JVM参数,当heap溢出时自动生成dump,vm options:-XX:+HeapDumpOnOutOfMemoryError  -XX:HeapDumpPath=${目录}

  2、jmap,命令:jmap -dump:live,file=D:/jvmdump/jmap.hprof [PID]

  3、jcmd,命令:jcmd <pid> GC.heap_dump D:/jvmdump/jmap.hprof

  4、jvisualvm或者jprofiler等可视化工具直接生成heap dump

参考:https://www.geeksforgeeks.org/how-to-generate-jvm-heap-memory-dump/

heap dump解析工具

       1 Jhat

       2 Memory Analyzer Mat(MAT)

       MemoryAnalyzer.ini修改heap size

       Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation

       https://www.cnblogs.com/zhihongShee/p/17461264.html

     【JVM】日志分析工具一Memory Analyzer Mat介绍和使用_memoryanalyzer_阿龙先生啊的博客-优快云博客

        FUll GC: 频繁的FUll GC会导致CPU升高,并且服务被挂起

                      通过apache的访问日志可以看到访问情况,基本都是500错误,

                       而且最后一列的(apache LogFormat %D)相应时间会变得很长

        OOM:只会影响自己的线程,其他线程不受影

     jvm-Stop the world

Java中Stop-The-World机制简称STW,Java中一种全局暂停现象,多半由于GC引起。所谓全局停顿,就是所有Java代码停止运行,native代码可以执行,但不能与JVM交互。

  • 其危害是长时间服务停止,没有响应;对于HA系统可能引起主备切换,严重危害生产环境。

  • 目前垃圾收集器的优化方向基本上都是在尽量减少或者缩短Stop The World的时间。

jvm-Stop the world:https://blog.youkuaiyun.com/jakeswang/article/details/107673734

            

 thread dump:

        thread dump文件主要保存的是java应用中各线程在某一时刻的运行的位置,即执行到哪一个类的哪一个方法哪一个行上。thread dump是一个文本文件,打开后可以看到每一个线程的执行栈,以stacktrace的方式显示。通过对thread dump的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,如数据库查询,长期得不到响应,最终导致系统崩溃。单个的thread dump文件一般来说是没有什么用处的,因为它只是记录了某一个绝对时间点的情况。比较有用的是,线程在一个时间段内的执行情况。

两个thread dump文件在分析时特别有效,困为它可以看出在先后两个时间点上,线程执行的位置,如果发现先后两组数据中同一线程都执行在同一位置,则说明此处可能有问题,因为程序运行是极快的,如果两次均在某一点上,说明这一点的耗时是很大的。通过对这两个文件进行分析,查出原因,进而解决问题。

jstack抓取 thread dump工具
jstack 是一个抓取 thread dump 文件的有效的命令行工具,它位于 JDK 目录里的 bin 文件夹下(JDK_HOME\bin),以下是抓取 dump 文件的命令:

jstack  <pid> > <file-path>
说明:

pid: Java 应用的进程 id ,也就是需要抓取 dump 文件的应用进程 id。

file-path: 保存 dump 文件的路径。
 

jstat

监视和收集Java虚拟机(JVM)的各种统计数据,例如垃圾回收情况、类加载情况、线程数量等。

jstat命令命令格式:
jstat [Options] vmid [interval] [count]
 
命令参数说明:
Options,一般使用 -gcutil 或  -gc 查看gc 情况
pid,当前运行的 java进程号 
interval,间隔时间,单位为秒或者毫秒 
count,打印次数,如果缺省则打印无数次
 
Options 参数如下:
-gc:统计 jdk gc时 heap信息,以使用空间字节数表示
-gcutil:统计 gc时, heap情况,以使用空间的百分比表示
-class:统计 class loader行为信息
-compile:统计编译行为信息
-gccapacity:统计不同 generations(新生代,老年代,持久代)的 heap容量情况
-gccause:统计引起 gc的事件
-gcnew:统计 gc时,新生代的情况
-gcnewcapacity:统计 gc时,新生代 heap容量
-gcold:统计 gc时,老年代的情况
-gcoldcapacity:统计 gc时,老年代 heap容量
-gcpermcapacity:统计 gc时, permanent区 heap容量

示例 1:jstat -gc 30149 5000
说明:每5 秒一次显示进程号为30149的 java进成的 GC情况,结果如下图

在这里插入图片描述

S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
单位:KB



示例2:jstat -gcutil 30149 5000
说明:每5 秒一次显示进程号为30149的 java进程垃圾回收统计情况,结果如下图

 在这里插入图片描述


S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间



 

<think>好的,用户想了解分析heapdump.hprof文件的工具推荐。首先,我需要回顾之前的对话和提供的引用内容。用户之前询问了IDEA Profiler的使用方法,现在转向具体的堆转储分析工具。 根据引用,用户提到了Eclipse MAT、VisualVM、Android Studio、jhat、JProfiler等工具。需要整理这些工具的特点和适用场景。用户可能是在开发或维护Java或Android应用,遇到了内存问题,需要分析堆转储找出内存泄漏或大对象。 需要区分不同平台,比如Android和标准Java应用,因为Android的hprof文件需要转换格式。引用[2]和[4]提到Android生成hprof的方法和转换工具hprof-conv,所以推荐Android Studio和转换后的工具使用。 用户可能希望一个全面的工具列表,包括开源和商业选项,以及它们的优缺点。例如,Eclipse MAT功能强大但学习曲线陡峭,VisualVM简单但功能有限,JProfiler商业但高效。同时,用户可能关心生产环境中的使用,引用[5]提到JProfiler的实时连接功能,适合生产环境避免大文件处理。 还要考虑用户可能的需求,比如是否需要命令行工具快速查看,比如jhat或jmap -histo,这在引用[1]和[3]中提到。此外,是否需要远程分析或其他工具集成,如IDEA Profiler导出到MAT。 用户可能没有明确说明是用于Android还是Java,所以需要分别推荐。同时,注意文件大小的问题,引用[1]提醒大文件需要足够内存,工具如MAT需要调整配置。此外,分析步骤如转换格式、重点检查大对象和引用链也是关键点。 最后,总结推荐,根据用户场景选择合适的工具,并提供使用建议,比如转换格式、内存配置和常见问题处理。确保回答结构清晰,工具分类明确,帮助用户根据具体情况选择最合适的解决方案。</think>根据引用内容和实际工具使用经验,以下是对分析heapdump.hprof文件的工具推荐及详细对比: --- ### 一、主流工具横向对比 | 工具名称 | 类型 | 适用平台 | 关键特性 | 引用依据 | |------------------|------------|-------------|---------------------------------------------|--------------------| | **Eclipse MAT** | 独立应用 | Java/Android| 支配树分析/泄漏报告/直方图对比 | [^1][^3] | | **JProfiler** | 商业工具 | Java | 实时内存追踪/CPU热点/OQL查询 | [^5] | | **Android Studio** | IDE集成 | Android | 原生支持转换格式/内存时间线/Activity泄漏检测 | [^1][^2][^4] | | **VisualVM** | 免费工具 | Java | 轻量级分析/线程监控/堆直方图 | [^1][^3] | | **jhat** | 命令行工具 | Java | 快速统计/HTTP查看/基础对象查询 | [^3][^5] | --- ### 二、具体工具使用指南 #### ▶ **Eclipse MAT(推荐首选)** - **优势**: - 精确计算**Retained Heap**(真实内存占用) - 自动生成**Leak Suspects Report** - 支持对比多个堆转储(对应引用[1]的优化验证需求) - **操作步骤**: ```bash # 启动参数调整(解决大文件分析OOM) -vmargs -Xmx8g # 修改MemoryAnalyzer.ini文件 ``` ![MAT支配树视图](https://help.eclipse.org/latest/topic/org.eclipse.mat.ui.help/images/dominator_tree.png) #### ▶ **Android Studio(移动端专用)** - **特殊处理**: - 必须先用`hprof-conv`转换格式(引用[2][4]) ```bash # 转换Android堆转储 ANDROID_SDK/platform-tools/hprof-conv dump.hprof converted.hprof ``` - **内存时间线功能**: - 检测Activity/Fragment泄漏(引用[4]的代码示例) - 显示Bitmap分配热点 #### ▶ **JProfiler(生产环境推荐)** - **实时分析优势**(对应引用[5]的直连特性): - 无需生成完整堆转储 - 远程Attach到运行中的JVM ```java // 快速定位大对象分配点 Allocations ➔ Record Allocations ➔ Filter by Size ``` - **内存视图对比**: ![JProfiler对比视图](https://www.ej-technologies.com/images/jprofiler/allocations.png) --- ### 、关键分析场景工具选择 #### 1. **快速定位OOM原因** - **推荐工具组合**: - `jmap -histo <pid>` ➔ 初步筛选Top对象(引用[5]) - Eclipse MAT的**Dominator Tree**(引用[3]) - **典型案例**: ```java // 静态Map未清理导致Old Gen增长(引用[4]的缓存问题) static Map<String, User> userCache = new HashMap<>(); ``` #### 2. **Android内存泄漏检测** - **标准流程**: 1. 代码生成`.hprof`(引用[4]的`dumpHprofData`) 2. `hprof-conv`转换格式(引用[2]) 3. Android Studio的**Heap Dump Analysis** - **重点关注**: - Activity/Fragment实例数 - Bitmap未回收 #### 3. **生产环境分析** - **低影响方案**: - JProfiler的**Live Attach**(引用[5]) - 远程JMX连接VisualVM - **安全获取堆转储**: ```bash # 使用jcmd减少对服务的影响(引用[1][5]) jcmd <PID> GC.heap_dump /path/to/safe_dump.hprof ``` --- ### 四、进阶分析技巧 #### ▶ **OQL对象查询(通用技能)** ```sql -- 查找所有超过1MB的byte数组(MAT/JProfiler/VisualVM通用) SELECT * FROM byte[] s WHERE s.@retainedHeapSize > 1048576 ``` #### ▶ **MAT对比分析(引用[1]优化验证)** 1. 捕获优化前后的堆转储 2. 使用**Compare Basket**功能 3. 查看新增对象/内存增长点 #### ▶ **线程内存分析** - 检查线程局部变量: ```java // 查找未释放的ThreadLocal(引用[3]的泄漏模式) ThreadLocal<BigObject> threadCache = new ThreadLocal<>(); ``` --- ### 五、工具资源获取 | 工具 | 下载地址 | 学习资源 | |-----------------|------------------------------------------|--------------------------| | Eclipse MAT | [Eclipse.org](https://www.eclipse.org/mat)| 《MAT权威指南》电子书 | | JProfiler | [EJ-Technologies](https://www.ej-technologies.com) | 官方互动教程 | | hprof-conv | Android SDK安装目录/platform-tools/ | Android开发者文档 | --- 通过结合具体场景选择工具,可显著提升分析效率。建议首次分析优先使用Eclipse MAT,生产环境实时诊断采用JProfiler,Android开发则依赖Android Studio的专业分析模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值