捕獲 java.lang.OutOfMemoryError?
Java 文件建議不要捕獲 java.lang.Error,包括 java.lang.OutOfMemoryError。但是,在某些情況下這樣做可能是合理的。
何時捕獲 OutOfMemoryError
僅考慮捕獲 OutOfMemoryError 以正常終止、釋放資源並記錄失敗原因。當由於堆資源不足而導致區塊記憶體分配失敗時,就會發生這種情況。然而,堆仍然包含分配的物件。透過刪除對運行時物件的引用,可以釋放更多記憶體以進行清理。
避免在Catch 處理程序中分配內存
要防止在catch 處理程序中進一步分配內存,請考慮:
範例程式碼
以下程式碼示範了擷取OutOfMemoryError 並釋放記憶體進行清除:
import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; public class OutOfMemoryErrorHandling { private static final int MEGABYTE = (1024 * 1024); public static void main(String[] args) { MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean(); for (int i = 1; i <= 100; i++) { try { byte[] bytes = new byte[MEGABYTE * 500]; } catch (OutOfMemoryError e) { // Cleanup operations: // Drop references to runtime objects // Release external resources (e.g., logging) MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage(); long maxMemory = heapUsage.getMax() / MEGABYTE; long usedMemory = heapUsage.getUsed() / MEGABYTE; System.out.println(i + " : Memory Use :" + usedMemory + "M/" + maxMemory + "M"); } } } }
>
捕捉應極度謹慎地處理OutOfMemoryError,並且僅是為了方便正常終止。透過仔細管理 catch 處理程序中的記憶體分配,可以避免進一步的記憶體問題,並允許在 JVM 退出之前進行適當的清理。
以上是什麼時候應該捕獲 Java OutOfMemoryError?的詳細內容。更多資訊請關注PHP中文網其他相關文章!