用法:
-XX:+HeapDumpOnOutOfMemoryError 當(dāng)堆拋出OOM錯(cuò)誤時(shí)竣贪,dump出當(dāng)前的內(nèi)存堆轉(zhuǎn)儲(chǔ)快照。
舉個(gè)栗子
public class OOM {
static class OOMObject {
}
//-Xmx20M -Xms20M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
public static void main(String[] args) {
List<OOMObject> list = new LinkedList<>();
while(true) {
list.add(new OOMObject());
}
}
}
這個(gè)例子很簡(jiǎn)單稳摄,就是不斷創(chuàng)建OOMObject限寞,加入到list中(為了讓GC Roots到對(duì)象之間有可達(dá)路徑万搔,避免被GC),直到堆內(nèi)存不夠時(shí)扣孟,拋出OOM異常烫堤。
運(yùn)行后,控制臺(tái)打印信息
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid97312.hprof ...
Heap dump file created [33684485 bytes in 0.424 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.gc.OOM.main(OOM.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
可以看到dump出了hprof文件可供分析凤价,可以用MAT工具進(jìn)行分析
用MAT打開后鸽斟,可以看到分析情況
image.png
image.png
由此也可以知道,是因?yàn)閘ist的容量過(guò)大而導(dǎo)致OOM利诺,可以根據(jù)此來(lái)進(jìn)行優(yōu)化代碼或者JVM參數(shù)富蓄。
如果是由內(nèi)存泄漏導(dǎo)致的,也可以通過(guò)工具查看泄漏對(duì)象到GC Roots的引用鏈慢逾,就能進(jìn)行相應(yīng)的分析處理立倍。
另一個(gè)與之相關(guān)聯(lián)的參數(shù):
-XX:HeapDumpPath=/temp/
該參數(shù)的含義是指定dump的文件目錄