当系统发生内存溢出时,我们一般的处理方式都是通过抓取内存堆转储快照的形式进行分析,本文我们介绍几种日常常用的dump文件分析工具。
准备工作
我们通过-XX:+HeapDumpOnOutOfMemoryError
参数让虚拟机在出现内存溢出时Dump出当前的内存堆转储快照,然后对Dump出的文件进行分析。
示例代码如下
import java.util.ArrayList;
import java.util.List;
public class HeapDump {
static class HeapDumpObject {
}
public static void main(String[] args) {
List<HeapDumpObject> heapDumpObjectList = new ArrayList<>();
while (true) {
heapDumpObjectList.add(new HeapDumpObject());
}
}
}
我们通过命令运行程序
javac HeapDump.java
java -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError HeapDump
此时程序会在程序运行目录下生成.hprof
格式的dump文件,我们可以针对此文件进行分析,查找内存泄漏对象的引用路径,并定位到代码具体位置。
工具一:JVisualVM
JVisualVM是JDK自带的dump,目前在JDK中已经没有预置此工具了,我们可以通过 官网进行下载。
点击左上角,可以加载我们的dump文件
可以切换摘要、线程等页签,查看不同的跟踪信息。
工具二:IntelliJ Idea自带的分析器
依次打开【视图】-【工具窗口】- 【分析器】
点击【打开快照】,选择我们上方生成的.hprof
文件
可以分析最大对象以及定位我们异常发生的位置。
工具三:MAT
MAT全称Memory Analyzer,是eclipse出品的一款独立的内存分析工具,可以在 官网下载。
打开软件后,选择[Open a Heap Dump]
可以查看对象占用空间等信息,也可以定位具体代码位置
工具三:JProfiler
JProfiler 是一款强大的性能分析工具,能够深入分析 Java 应用程序的 CPU 使用情况、内存消耗、线程状态和数据库查询,从而帮助快速定位性能瓶颈。
打开JProfiler后,点击左上角【会话】-【打开快照】,可以选择我们本地的dump文件。
双击占用最大的类,然后引用选择【传入引用】
在【引用】页签,选择点击【显示更多】,可以查看异常代码的位置。
评论 (0)