1. 程式人生 > >深入理解Java虛擬機器-OOM分析

深入理解Java虛擬機器-OOM分析

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物件