-XX:HeapDumpOnOutOfMemoryError

用法:
-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打開(kāi)后,可以看到分析情況

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的文件目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容