Java Heap Dump 分析步骤

前言

生产环境中Java应用难免遇到Out Of Memory或内存持续占用过大的问题。对于此类问题通用的分析方法是对问题进程的heap dump进行分析,重点关注占用内存较大的对象。本篇为大家带来分析Java进程heap dump的方法。

事先需要准备软下软件包:

  • JDK 11+(目前MAT最新版本1.13.0要求使用)
  • Memory Analyzer Tool (MAT)

MAT官方下载页面:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation

软件包准备就绪后,解压JDK和MAT到任意目录,无需其他安装操作。

配置

由于目前新版本的MAT工具需要JDK11或者更高版本的运行环境,如果机器环境为JDK11以下,需要单独为MAT工具配置专门的JDK。方法为编辑MAT安装目录中的MemoryAnalyzer.ini文件,在文件开头加入如下内容:

-vm
/path/to/jdk-11.0.17+8/bin/java

/path/to/jdk-11.0.17+8/bin/java替换为真实环境中JDK11的java可执行文件的路径。

Heap Dump文件生成

这一节介绍下如何获取Java进程的heap dump。

使用命令

使用命令可以立刻获取某个Java进程的heap dump。

使用jmap命令:

jmap -dump:live,format=b,file=/path/to/heapdump.hprof <pid>

使用jcmd命令:

jcmd <pid> GC.heap_dump /path/to/heapdump.hprof

其中<pid>为需要分析的Java进程的pid。/path/to/heapdump.hprof为生成的heap dump文件所在的路径。

在特定时间点生成

考虑到如下场景:我们需要获取Java程序出现异常的时候(例如OOM)的heap dump。这种场景下我们无法使用上面讲解的命令,Java进程出现问题的时候可能已经被系统kill掉。因此我们需要配置JVM,让他能够在特定时间点自动生成heap dump。

下面列出生成heap dump的时间点和对应的JVM参数。

在OOM的时候生成heap dump:

-XX:+HeapDumpOnOutOfMemoryError

在full GC前生成heap dump:

-XX:+HeapDumpBeforeFullGC

在full GC后生成heap dump:

-XX:+HeapDumpAfterFullGC

在按下ctrl+break的时候生成heap dump:

-XX:+HeapDumpOnCtrlBreak

注意:指定heap dump文件生成的路径需要配置-XX:HeapDumpPath=/path/to/heapdump.hprof

使用VisualVM生成heap dump

生产环境多用命令或者JVM参数的方式生成heap dump。当然在本机开发测试的时候还可以使用图形化工具生成heap dump,例如VisualVM等。

VisualVM的下载页面:VisualVM: Download。下载后解压到任意目录,运行bin目录下的visualvm可执行文件,打开它的图形界面。

生成heap dump只需要在左边的application选择需要heap dump的进程,然后在右边栏目依次点击Monitor -> Heap Dump。如下图:

VisualVM

注意:如果运行VisualVM的时候提示JDK找不到,需要为VisualVM单独配置。方法为编辑VisualVM安装目录中的etc/visualvm.conf。修改或添加这一行:

visualvm_jdkhome="/path/to/java_home"

然后重新运行VisualVM。

Heap Dump分析

对于不是很大的heap dump文件(不大于MAT分析机器内存的1.2倍),我们可以将heap dump文件压缩后下载到本地,使用MAT图形界面方式分析。操作方法比较直观(File -> Open Heap Dump...),这里不再赘述。

生产环境中可能遇到特别大的heap dump。比如我们要分析一个30G的heap dump。将其在服务器上压缩之后,空间占用仍有大约10G,下载到本地耗时很长。本地开发机器一般也很少见32G内存机器,分析的时候会出现内存溢出问题。这种情况下我们需要使用MAT提供的命令行功能,在服务器上进行分析并输出分析报告。这些分析报告是静态的web页面,只有几百KB大小。需要在本地做的仅仅是将这些报告下载下来用浏览器打开,这样完美避免了本地开发环境配置不足的问题。

在服务器上使用MAT命令行分析的方法很简单。在MAT安装目录中执行:

./ParseHeapDump.sh xxx.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components

其中xxx.hprof在实际使用的时候需要替换为hprof文件的路径。运行完毕后在hprof文件所在目录会生成一系列的index/threads文件和3个压缩文件。这3个压缩文件是我们重点关注的分析报告,分别为:

  • xxx_Leak_Suspects.zip:报告包含怀疑造成内存泄漏的地方,报告中包含了class层级图。对于OOM的场景能够很容易的定位到是哪个对象占用了大量内存不释放。
  • xxx_System_Overview.zip:包含heap dump基本信息,dump进程JVM的相关配置和线程信息等。
  • xxx_Top_Components.zip:查看占用空间最大的几个object/class/classloader/package等。报告以饼图和表格的形式展示。通过这个报告可以定位出Java程序运行时哪些对象占用内存较多,对问题排查和程序优化很有帮助。

这三个报告是分析问题的关键。我们通过报告找出内存占用过大的对象,然后结合日志和项目源代码分析程序逻辑,逐步定位出问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容