HOWTO · Java
在 Java 中處理 OutOfMemoryError 異常
本教程描述並演示了 Java 中的 OutOfMemoryError 異常。
本頁內容
JVM 無法在堆空間中分配物件時丟擲 OutOfMemoryError 異常。堆空間用於儲存執行時建立的物件。
JVM 中有兩個不同的空間部分,Permgen 和 Heap Space。本教程描述 OutOfMemoryError 異常並演示如何處理它。
Java 中的 OutOfMemoryError 異常
當 Java 虛擬機器發現沒有足夠的記憶體用於在堆空間中儲存新物件時,它會丟擲 OutOfMemoryError。
當使用者做錯事時丟擲 OutOfMemoryError。例如,使用者試圖通過長時間持有物件來處理高資料。
當使用者無法處理捕獲字串的第三方庫或部署後未清理的應用程式伺服器時,這也可能是一個錯誤。
本機庫程式碼也可能引發此錯誤;例如,當交換空間不足時,無法滿足本地分配。
例子:
package delftstack;
public class Out_Of_Memory_Error {
public void Out_Of_Memory_Array(int array_size) {
try {
Integer[] Demo_Array = new Integer[array_size];
} catch (OutOfMemoryError e) {
System.err.println("Array size is too large for memory");
System.err.println("The Maximum JVM memory is : " + Runtime.getRuntime().maxMemory());
e.printStackTrace();
}
}
public static void main(String[] args) {
Out_Of_Memory_Error demo = new Out_Of_Memory_Error();
demo.Out_Of_Memory_Array(1000000000);
}
}
這段程式碼嘗試建立一個長度為 1000000000 的陣列,這對於 JVM 來說是不可能的,因為它會耗盡記憶體。輸出將顯示 JVM 記憶體和錯誤。
輸出:
Array size is too large for memory
The Maximum JVM memory is : 1046478848
java.lang.OutOfMemoryError: Java heap space
at delftstack.Out_Of_Memory_Error.Out_Of_Memory_Array(Out_Of_Memory_Error.java:6)
at delftstack.Out_Of_Memory_Error.main(Out_Of_Memory_Error.java:17)
處理 Java 中的 OutOfMemoryError 異常
一旦我們知道導致 OutOfMemoryError 的原因,我們就可以修復它,以便 JVM 可以將物件儲存在 Java 堆空間中。下面我們來看看 java.lang.OutOfMemoryError 不同原因的不同解決方案。
使用 -Xmx 選項處理 Java 中的 OutOfMemoryError 異常
OutOfMemoryError 最常見的原因是 Java 虛擬機器堆空間的大小。IDE 可以使用 -Xmx 選項解決此問題。
此配置將堆空間增加到 1024 大小。但是,增加堆大小並不能保證解決所有錯誤,例如記憶體洩漏錯誤。
堆空間大小的增加也會增加 GC 的長度。讓我們看看如何解決堆大小問題。
當我們使用 Eclipse IDE 時,從安裝資料夾中開啟 eclipse.ini 檔案:
現在,我們可以根據系統要求更改 Xmx 值:
現在,重新啟動 Eclipse 以解決錯誤。
使用記憶體分析器工具處理 Java 中的 OutOfMemoryError 異常
增加堆大小會產生其他問題,但並不能保證解決問題。更好的方法是檢視錯誤所在並相應地解決它。
另一個常見的原因是記憶體洩漏,如果 JVM 中存在記憶體洩漏,它也會丟擲 OutOfMemoryError。要檢查記憶體洩漏,我們可以使用 IDE 工具。
例如,Eclipse 有 Memory Analyzer Tool (MAT),它可以檢查記憶體洩漏並減少記憶體消耗。可以從這裡下載 MAT。
使用此工具,我們可以分析記憶體洩漏並解決 OutOfMemoryErorr 錯誤。