深入理解Java虛擬機器-OOM分析
阿新 • • 發佈:2018-11-04
OOM即Out Of Memory Error,記憶體溢位。
如果不斷的建立物件,並且這些物件到GC Roots之間有可達路徑,那麼這些物件就不會被垃圾回收機制清楚,當物件數量達到容量限制是就會產生記憶體溢位。
在虛擬機器中,只有程式計數器不會產生OOM,除此之外其他幾個執行時區域都有可能發生OOM。
下面通過一段程式碼模擬記憶體溢位:
public class OOMObject { private Date now; private int index; public OOMObject(int i) { now = new Date(); index = i; } public Date getNow() { return now; } public int getIndex() { return index; } }
// -Xms20m -Xmx20M -XX:+HeapDumpOnOutOfMemoryError public class HeapOOM { @Test public void test1() { List<OOMObject> list1 = new ArrayList<OOMObject>(); List<OOMObject> list2 = new ArrayList<OOMObject>(); int i = 0; while(true) { list1.add(new OOMObject(i++)); list2.add(new OOMObject(i++)); } } }
然後在eclipse中設定:
執行時引數:
-Xms 堆最小記憶體
-Xmx 堆最大記憶體
-XX:+HeapDumpOnOutOfMemoryError 虛擬機器在出現記憶體溢位時,dump出當時的記憶體堆轉儲快照
啟動執行,片刻後輸出
在工程的根目錄中生成了一個 java_pid15096.hprof 檔案
將該檔案拖入eclipse中(eclipse中已經安裝了Memory Analyer外掛)
分析發現,在記憶體溢位時,記憶體中已經建立了344533個OOMObject物件