1. 程式人生 > >讀書筆記-深入理解JVM虛擬機-1.OOM初探

讀書筆記-深入理解JVM虛擬機-1.OOM初探

-a 最大 xms stat new 理解 虛擬機 class 當前

Java堆OOM(Out-Of-Memory)異常
執行例如以下程序,爆出異常 java.lang.OutOfMemoryError: Java heap space
/**
 * VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
 * @author zzm
 */
public class HeapOOM {


	static class OOMObject {
	}


	public static void main(String[] args) {
		List<OOMObject> list = new ArrayList<OOMObject>();


		while (true) {
			list.add(new OOMObject());
		}
	}
}


分析:
1.內存配置
-Xms20m 堆的大小是20M
-Xmx20m 堆最大能夠擴展到20M,因為堆的大小本來就是20M 所以該堆不能夠擴展
-XX:+HeapDumpOnOutOfMemoryError 當出現OutOfMemory異常的時候導出堆文件


OOMObject用來占用空間,用一個List來存儲OOMObject以保證我們每一個生成的OOMObject對象能夠和GCRoot引用鏈連接起來
這種話就會導致OOM異常。由於每一個對象都是實用的(都是能夠和GCRoot連接起來的)


分析OOM問題的一般過程例如以下
1.發生OOM了
2.推斷發生OOM的位置的對象是否應該是該存活的
3.假設OOM位置的對象是不應該存活的並且發生了OOM異常,那就是我們的程序寫的有問題
4.假設OOM的位置的對象是應該存活的可是卻發生了OOM異常,那我們就應該適當調整JVM參數了


關於當前這個樣例:
非常明顯我們用的是死循環一直創建對象,而且用List保存持有對象的實例,導致了JVM無法回收創建的對象,所以產生了OOM問題

讀書筆記-深入理解JVM虛擬機-1.OOM初探