2012-03-22 81 views
0

對於課外練習涉及異常處理,我需要製作一個OutOfMemoryError異常,所以我可以寫一個try-catch和抓住它:什麼是OutOfMemoryError異常,以及如何生成它?

"13.10 (OutOfMemoryError) Write a program that causes the JVM to throw an OutOfMemoryError and catches and handles this error."

我搜索了Java API和上找不到的OutOfMemoryError任何異常在例外列表中。什麼是OutOfMemoryError異常,以及如何爲我的任務生成一個異常?

+1

當您搜索到OOME時,您發現了什麼? – 2012-03-22 00:10:00

+1

提示:異常/錯誤的名稱是什麼? – Mysticial 2012-03-22 00:10:27

+2

如何在OutOfMemoryError上找到Java API信息:轉到[API文檔](http://docs.oracle.com/javase/6/docs/api/index.html),按Ctrl + F,鍵入OutOfMemoryError,然後按回車。 – 2012-03-22 00:10:43

回答

3

的OutOfMemoryError被拋出當t他的JVM無法分配足夠的內存來完成請求的操作。爲了產生這些只是在循環或類似的東西中分配一堆內存,但要記住保留已經分配好的對象,最好在一個ArrayList或其他東西中,否則垃圾回收器可能會重新使用該空間並釋放一些內存。

喜歡的東西

ArrayList<Object> list = new ArrayList<Object>(); 

try { 
    while (true) 
     list.add(new Object()); 
} catch (OutOfMemoryError e) { 
    // And we are done... 
} 

你可能想帶班,佔用了一些相當大的空間,否則這可能需要一些時間來替換對象。

參考: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/OutOfMemoryError.html

4

我能想到的最簡單的方法:

for (String x = "x";; x += x); 

你可能希望得到一個有點創意以更快的速度崩潰了。

+0

在你寫「for(;;){x = x + 1}」之前寫這樣的for循環意味着什麼? 「 – Zolani13 2012-03-22 01:03:02

+0

@Zolani:'for(;;)'是一個無限循環 – 2012-03-22 01:03:44

1

當虛擬機內存不足以分配新對象時,虛擬機引發一個OutOfMemoryError。因此,當您創建太多對象時,可能會導致此異常發生。

爲此,請開始創建不會由垃圾收集器收集的對象(例如,將它們鏈接到一個無限循環中) - 虛擬機將最終耗盡可用內存,以便將下一個對象被分配,拋出異常。當你抓住它時,要小心,因爲你不能做太多事情 - 虛擬機沒有(很多)內存用於任何操作。

5

簡單多了(並保證工作)比創建數百萬個對象:

public static void throwOomE() { 
    throw new well, you can just search for the rest of the answer 
} 
+1

我剛剛提出這個建議,+1 – Jeffrey 2012-03-22 00:19:55

+0

例外騙子! – mishadoff 2012-03-22 00:26:57

1

OutOfMemoryException當你heap包含新的對象沒有自由空間出現。 你也應該堅持引用對象的地方,否則garbage colector照顧他們。

二進制崩潰(字節需要增加一倍每次迭代:)

String x = "1"; 
while (true){ 
    x = (x + x); 
} 

**讀取所有引用更好地理解

3

我最喜歡的方式來做到這一點。

byte[] crasher = new byte[Integer.MAX_VALUE]; 
相關問題