内存分析诊断系列-理解heap dump

内存分析诊断系列-理解heap dump

01

 Heap Dump是什么?

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

◆◆◆

01

 Heap Dump里面有什么?

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

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

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

  • Garbage Collections Roots:JVM可达的对象

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

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

  • 找出内存泄漏的原因;

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

  • 分析集合的使用;

  • 分析类加载器

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

03

 怎样获取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文件保存到一个独立的文件夹,在接下来的分析中会通过这个文件创建很多图表文件。

04

 

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并点击,然后找到要做调整的参数并做设置就好了。

05

 总结

      

  java应用程序出现问题的原因可能很多,了解内存分析性能诊断也很有必要,本篇文章,我们介绍了一些基础的概念,目的是为后续分析奠定理论基础,知识点总结如下:

1)heap dump 的基本概念。

2)heap dump所包含的内容。

3)如何获取heap dump。

4)MAT工具(Memory Analyzer)的介绍。

创建了一个java方面的互助群,和其他传统的学习群不同。

在本群,你可以

1)阐述你在开发过程中遇到的问题,群友集思广益,高效解答。

2)分享自己学习的一些心得,让后来学习者少踩坑。

3)资源共享,无论是好的学习视频还是文档都可以在群内共享。

别人有可能可以给你提供一些思路和看法

同样,如果你也乐于帮助别人,那解决别人遇到的问题,也同样对你是一种锻炼。

扫码回复【加群】,邀请你进群一起交流讨论

好看的人才能点

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值