定位和解析引起OOM(Out of Memory)的dump文件是一个系统性的工作,涉及到多个工具和步骤。以下是一些常用的方法和工具:
-
使用DebugDiag工具:
- DebugDiag是一个强大的工具,可以自动收集和分析dump文件。它包含两个部分:DebugDiag 2 collection用于收集dump文件,DebugDiag 2 analysis用于分析dump文件。
- 在DebugDiag中,你可以设置规则来自动抓取Dump文件,也可以手动抓取Process的Dump文件。
-
使用WinDbg工具:
- WinDbg是微软提供的一个强大的调试工具,它可以用来分析Dump文件。
- 使用WinDbg时,需要设置符号文件的位置,以便正确解析内存地址和代码。
-
使用jhat工具:
- jhat是JDK自带的一个工具,可以用来解析hprof格式的dump文件,并提供一个简易的web服务,通过浏览器查看内存中的统计信息。
- 一般使用方法是:
jhat <dump文件路径>
,然后通过浏览器访问http://127.0.0.1:7000
来查看分析结果。
-
使用Eclipse Memory Analyzer (MAT):
- MAT是一个用户友好的工具,用于分析Heap Dump文件。它可以帮助识别内存泄漏和消耗大量内存的对象。
- 通过MAT的“Leak Suspects”报告,可以找出内存泄漏的可疑点,而“Top Components”报告则列出占用总堆内存超过1%的对象。
-
使用jvisualvm工具:
- jvisualvm是JDK自带的一个工具,可以用来分析dump文件,查看触发OOM的线程堆栈,清晰得知程序溢出的原因。
- 通过jvisualvm,可以查看JVM内存里保留大小最大的对象,并选择排查个数。
-
分析OOM发生时的线程堆栈:
- 通过分析dump文件中的线程堆栈信息,可以定位到发生OOM的具体位置,例如具体的类和方法。
-
查看内存分配情况:
- 通过分析dump文件,可以查看内存分配是否合理,是否有对象占用内存过高而没有释放。
-
导出JVM当前内存快照:
- 使用
jmap -dump:file=[文件路径] [pid]
命令可以导出JVM当前的内存快照,然后使用上述工具进行分析。
- 使用
通过上述工具和方法,可以有效地定位和解析引起OOM的dump文件,从而找到问题的根源并采取相应的解决措施。
使用MAT(Eclipse Memory Analyzer Tool)查看内存泄漏的疑点主要通过以下几个步骤:
-
打开Heap Dump文件:
- 启动MAT后,通过点击
File
->Open Heap Dump
选择并打开你的.hprof
文件。
- 启动MAT后,通过点击
-
选择Leak Suspects Report:
- 在打开文件后,MAT会提供一个向导,其中可以选择
Leak Suspects Report
选项,这个报告会帮助你识别可能的内存泄漏点。
- 在打开文件后,MAT会提供一个向导,其中可以选择
-
查看Leak Suspects报表:
- 在Leak Suspects报表中,MAT会展示一个饼图,颜色较深的部分表示可能存在内存泄漏的疑点。每个疑点都会有对应的详细信息。
-
分析疑点详细信息:
- 点击每个疑点,可以查看更详细的信息,包括哪个类、哪个实例占用了大量内存,以及它们是如何被引用的。例如,报告可能会显示某个线程持有大量内存,或者某个对象实例累积了大量的内存。
-
查看引用链条:
- 通过查看对象到GC Roots的最短路径,可以分析对象为何无法被垃圾回收。这可以通过点击
Leak Suspects
中的Details
来获取实例到GC Root的最短路径信息。
- 通过查看对象到GC Roots的最短路径,可以分析对象为何无法被垃圾回收。这可以通过点击
-
使用Histogram视图:
- Histogram视图以类为维度显示实例数和每个类的内存使用量,可以帮助查询哪些类对象占用了较大内存。
-
使用Dominator Tree:
- Dominator Tree可以帮助了解哪些root对象是GC无法释放大内存的原因,通过分析Shallow Heap和Retained Heap的大小来识别问题。
-
分析线程视图:
- 线程视图展示了线程内对象的引用关系和方法调用关系,可以帮助更清晰地看到内存中具体的数据和泄漏点。
通过这些步骤,你可以使用MAT工具来定位和分析内存泄漏的疑点。记住,Leak Suspects报表中列出的疑点并不总是100%准确,需要进一步的分析来确认是否真的存在内存泄漏。
使用MAT(Eclipse Memory Analyzer Tool)的Leak Suspects报表来查看内存泄漏疑点时,可以按照以下步骤进行:
-
打开Leak Suspects报表:
- 在MAT中打开一个Heap Dump文件后,选择Leak Suspects Report选项,这将自动展示可能造成内存泄漏的疑点。
-
查看饼图:
- Leak Suspects报表会展示一个饼图,其中颜色较深的部分表示可能存在内存泄漏的区域。
-
分析疑点详情:
- 每个疑点都会有对应的详情信息。这些信息包括占用的内存大小、对象的类名、加载器等。
-
查看对象的GC Root路径:
- 通过点击“Details”链接,可以查看与疑点相关的查询结果,包括对象到GC Roots的最短路径。
-
分析内存累积点:
- 报告会指出内存累积在哪个实例中,例如:“The memory is accumulated in one instance of ‘java.lang.Object[]’, loaded by ‘’, which occupies 617.55 KB (52.54%) bytes.” 这句话说明了内存累积在一个特定的对象实例中,这个实例占用了大量内存。
-
查看线程堆栈:
- 如果疑点是线程,报告会展示调用堆栈以及相关的栈帧和局部变量,这有助于快速定位内存泄漏的具体位置。
-
使用Keywords:
- 报告中的Keywords是用于标识每个疑点的唯一标识符,可以用来在团队之间共享和追踪问题。
-
导出分析报告:
- MAT可以将Leak Suspects报表的内容压缩打包到一个zip文件中,方便分享和进一步分析。
通过这些步骤,你可以使用MAT的Leak Suspects报表来识别和分析内存泄漏的疑点。记住,Leak Suspects报表提供的是疑点,并不一定意味着确定存在泄漏,需要进一步的分析来确认。