使用jvisualvm排查一次記憶體溢位(OOM)過程
記憶體溢位在開發中或者線上出現的概率很高,造成的直接原因就是系統執行緩慢,或者直接宕機了。
小編在這裡模擬下記憶體溢位的情況以防患於線上出現記憶體溢位要如何排查問題。題外話(線上出問題你需要生成一個快照(hprof檔案),在本地檢視問題),當然了還有其他工具除錯如阿里的Arthas、還有MAT。我這裡只演示jvisualvm。
我使用的jdk版本是jdk1.8.0_05
先準備一個可以出現記憶體溢位的程式碼
之後在IDEA中配置VM引數【-Xms2m -Xmx4m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\jvmtest】
說明一下:
-Xms 為jvm啟動時分配的記憶體,比如-Xms2m,表示分配2M。
-Xmx 為jvm執行過程中分配的最大記憶體,比如-Xmx4m,表示jvm程序最多隻能夠佔用4M記憶體。
-XX:+HeapDumpOnOutOfMemoryError 表示出現OutOfMemoryError異常時,記錄快照。
-XX:HeapDumpPath 表示快照的儲存位置(這裡可以設定檔名字,也可以不設定),不設定名字它會自己生成的。
執行後,會丟擲如下異常
看到如下:Heap dump file created [5505387 bytes in 0.042 secs],那就計算下使用了多少M
可以看得出,明顯超出了4M。使用jvisualvm.exe來開啟生成的hprof檔案
提示記憶體溢位了。點選main執行緒進入
看到了ArrayList,點進去
可以看得到ArrayList的儲存大小(33384)。在點選到elementData看看裡面儲存的什麼元素
可以清晰的看得出是TestOOMA$OOMObject這個物件,也就是我上面例子中的物件。另外在類檢視中也可以看見這個物件在飆升。
也就分析出,記憶體溢位的原因就是因為瘋狂的建立物件造成的。
好的程式碼像粥一樣,都是用時間熬出來的