转载自   关于Heap Dump

Heap Dump是什么?

Heap Dump也叫堆转储文件,是一个Java进程在某个时间点上的内存快照。Heap Dump是有着多种类型的。不过总体上heap dump在触发快照的时候都保存了java对象和类的信息。通常在写heap dump文件前会触发一次FullGC,所以heap dump文件中保存的是FullGC后留下的对象信息。

我们可以通过Heap Dump做哪些事情?

一般在Heap Dump文件中可以获取到(这仍然取决于heap dump文件的类型)如下信息:

  • 对象信息:类、成员变量、直接量以及引用值;

  • 类信息:类加载器、名称、超类、静态成员;

  • Garbage Collections Roots:JVM可达的对象;

  • 线程栈以及本地变量:获取快照时的线程栈信息,以及局部变量的详细信息。

也就是说我们可以对上面这些内容进行分析。通常可以基于Heap Dump分析如下类型的问题:

  • 找出内存泄漏的原因;

  • 找出重复引用的jar或类;

  • 分析集合的使用;

  • 分析类加载器。

总而言之我们对Heap Dump的分析就是对应用的内存使用进行分析,从而更加合理地使用内存。

怎样获取Heap Dump?

获取heap dump有多种方式,可以通过参数配置在特定的条件下触发堆转储,也可以通过工具来获取。

1. 通过OutOfMemoryError获取heap dump

通过设置如下的JVM参数,可以在发生OutOfMemoryError后获取到一份HPROF二进制Heap Dump文件:

-XX:+HeapDumpOnOutOfMemoryError

生成的文件会直接写入到工作目录。

这个方案适用于如下版本的虚拟机:Sun JVM (1.4.2_12 or higher and 1.5.0_07 or higher), HP-UX JVM (1.4.2_11 or higher) and SAP JVM (since 1.5.0)。

2. 主动触发Heap Dump

也可以为虚拟机设置下面的参数,这样就可以在需要的时候按下CTRL+BREAK组合键随时获取一份heap dump文件。

-XX:+HeapDumpOnCtrlBreak

3. 使用HPROF agent

使用agent可以在程序执行结束时或者收到SIGQUIT信号时生成dump文件。使用agent也是要配置虚拟机参数的:

-agentlib:hprof=heap=dump,format=b

这种方式我没有试过,具体如何做的不是很清楚。

4. 使用jmap

这个算是用的最多的方式了吧。也很简单,执行下面的命令就可以了:

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

5. 使用jconsole

启动一个应用后,打开<JAVA_HOME>/bin/jconsole.exe,在jconsole中选择正在运行的应用:

(在这个例子中选择的是eclipse,虽然进程名称为空,但是通过重启eclipse可以确认)。

建立连接后,选择页签MBean,执行com.sun.management. HotSpotDiagnostic下的操作dumpHeap。第一个参数p0是要获取的dump文件的完整路径名,记得文件要以.hprof作为扩展名(要在Memory AnalysisPerspective下打开扩展名必须是这个)。如果我们只想获取live的对象,第二个参数p1需要保持为true。

建议将导出的dump文件保存到一个独立的文件夹,在接下来的分析中会通过这个文件创建很多图表文件。

6. 使用Memory Analyzer

如果要获取dump文件的Java进程和Memory Analyzer在同一台机器上,可以直接使用Memory Analyzer获取dump文件。采用这种方式获取dump文件后会直接将之解析并在Memory Analyzer中打开(这个方式我不太喜欢,因为会在用户目录下生成很多零碎的文件)。

获取heap dump是受虚拟机支持的一种特定的功能。Memory Analyzer提供了一些被称为Heap Dump Provider的概念:比如支持Sun虚拟机(需要用到Sun JDK的jmap功能)的Provider或支持IBM虚拟机(也需要一个IBM JDK)的Provider。此外,Memory Analyzer也提供了对用户自定义的Heap Dump Provider插件的扩展支持。

要使用Memory Analyzer获取dump文件需要先打开Memory AnalysisPerspective,而后点击File -> Acquire Heap Dump…菜单项。之后会打开如下窗口:

在上图中,根据具体的运行环境,预装的Heap Dump Provider按照默认设置展示了当前正在运行的java进程列表。一些Heap Dump Provider也允许(或者说需要)设置一些额外的参数(比如heap dump的类型),这个可以点击Configure按钮来设置。选择要dump的线程,点击Next按钮就可以生成dump文件了。

有的时候进程列表可能为空,这时有必要调整下Heap Dump Provider的设置了。点击Configure按钮,选择合适的provider并点击,然后找到要做调整的参数并做设置就好了。

此外,IBM的虚拟机还有自己的一套方法,这里就不写出了。

关于Heap Dump相关推荐

  1. 认识Java Core和Heap Dump

    什么是Java Core和Heap Dump Java程序运行时,有时会产生Java Core及Heap Dump文件,它一般发生于Java程序遇到致命问题的情况下. 发生致命问题后,Java进程有时 ...

  2. eclipse MAT分析heap dump

    官方参考文档:http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Ftasks%2Fanalyzingth ...

  3. [Android]生成heap dump文件(.hprof)

    Android生成heap dump文件(.hprof) 一个heap dump就是一个程序heap的快照,能够获知程序的哪些部分正在使用大部分的内存. 它保存为一种叫做HPROF的二进制格式.对于A ...

  4. 生成 Heap Dump 的几种方式

    Heap Dump 概述 Heap Dump 是 Java进程所使用的内存情况在某一时间的一次快照.以文件的形式持久化到磁盘中. Heap Dump的格式有很多种,而且不同的格式包含的信息也可能不一样 ...

  5. 学习jvm,关于MAT an internal error occurred during:Parsing heap dump from问题

    写了一个死循环不断的创建对象,模拟内存溢出 1 package com.zuo.test1; 2 3 import java.util.ArrayList; 4 import java.util.Li ...

  6. java dumpheap_java程序性能分析之thread dump和heap dump

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

  7. java heap 查看_使用VisualVM查看Java Heap Dump

    浏览Heap Dump 可以使用VisualVM浏览heap dump文件的内容,从而快速查看在堆中分配的对象.Heap dumps在主窗口的heap dump子标签页中显示.你可以打开保存在本地的h ...

  8. [Java]使用jConsole导出java程序的heap dump文件

    [Java]使用jConsole导出Java程序heap dump文件 Heap dump文件存储着在该文件生成时,Java程序的所有未被回收的Objects的信息.通过使用MAT工具,可以揪出内存泄 ...

  9. Java Heap dump文件分析工具jhat简介

    jhat 是Java堆分析工具(Java heap Analyzes Tool). 在JDK6u7之后成为标配. 使用该命令需要有一定的Java开发经验,官方不对此工具提供技术支持和客户服务. 用法: ...

最新文章

  1. python importerror怎么解决-解决python有时候import不了当前的包问题
  2. WPF中splashScreen启动程序之前出现一个过程动画的效果
  3. TensorFlow2.0(五)--Keras构建Wide Deep模型
  4. Total Commander 常用快捷键
  5. 大话functional编程语言
  6. mysql多表格数据合并_mysql 如何实现两个表数据统计合并
  7. 【OOC学习19】TKBrep:边界表示法的实现
  8. 面试官:你在平时的工作中遇到过哪些问题让你印象深刻?
  9. 九龙证券“风光储锂芯”集体回暖 创业板指探低回升
  10. 使用 Entity Framework Power Tool 报错 0×80070057 解决方法
  11. string::assign
  12. 《浪潮之巅》作者吴军:把握技术革命的浪尖
  13. 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决
  14. 《当程序员的那些狗日日子》(五十五)另一种生存之道
  15. MySQL 排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题
  16. flutter报错: [!] Automatically assigning platform `iOS` with version `8.0` on target `Runner` becaus
  17. EZ 2018 02 28 NOIP2018 模拟赛(二)
  18. CS5250(无电感电荷泵升压5.3W防破音单声道音频功放IC)
  19. [系统]制作老毛桃U盘WinPE
  20. Python脚本实现【大麦网】抢票程序,今年我一定要去听一场演唱会

热门文章

  1. [蓝桥杯2018决赛]阅兵方阵-模拟,枚举
  2. [蓝桥杯2016初赛]寒假作业-next_permutation枚举
  3. Decorator(装饰)--对象结构型模式
  4. PTA天梯赛L1-006 连续因子 (20分)
  5. Python--第4次平时作业
  6. FastDFS分布式文件系统设计原理
  7. Java ThreadLocal
  8. 【HNOI2019】白兔之舞【组合数学】【矩阵快速幂】【单位根反演】【Chirp Z-Transform】【原根】【MTT】
  9. 【BZOJ3451】Normal【期望线性性】【点分治】【NTT卷积】
  10. Codeforces Round #735 (Div. 2)