3 回答

TA貢獻2037條經(jīng)驗 獲得超6個贊
OutOfMemoryError
OutOfMemoryError
OutOfMemoryError
OutOfMemoryError
Error
OutOfMemoryError
private static final int MEGABYTE = (1024*1024);public static void runOutOfMemory() { MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean(); for (int i=1; i <= 100; i++) { try { byte[] bytes = new byte[MEGABYTE*500]; } catch (Exception e) { e.printStackTrace(); } catch (OutOfMemoryError e) { MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage(); long maxMemory = heapUsage.getMax() / MEGABYTE; long usedMemory = heapUsage.getUsed() / MEGABYTE; System.out.println(i+ " : Memory Use :" + usedMemory + "M/" + maxMemory + "M"); } }}
1 : Memory Use :0M/247M......98 : Memory Use :0M/247M99 : Memory Use :0M/247M100 : Memory Use :0M/247M
Error
Error
catch(Throwable t) {}

TA貢獻1878條經(jīng)驗 獲得超4個贊
package com.stackoverflow.q2679330;public class Test { public static void main(String... args) { int size = Integer.MAX_VALUE; int factor = 10; while (true) { try { System.out.println("Trying to allocate " + size + " bytes"); byte[] bytes = new byte[size]; System.out.println("Succeed!"); break; } catch (OutOfMemoryError e) { System.out.println("OOME .. Trying again with 10x less"); size /= factor; } } }}
1:捕捉java.lang.OutOfMemoryError可能是個好主意。
2:如果我們捕獲java.lang.OutOfMemoryError,如何確保CATCH處理程序本身不分配任何內(nèi)存(任何工具或最佳實踐)?
try
private static byte[] reserve = new byte[1024 * 1024]; // Reserves 1MB.
} catch (OutOfMemoryException e) { reserve = new byte[0]; // Ha! 1MB free!}

TA貢獻1936條經(jīng)驗 獲得超7個贊
OOME也可以拋到其他線程上,包括應用程序甚至不知道的線程。任何這樣的線程現(xiàn)在都會死掉,任何等待通知的東西都可能永遠被卡住。簡而言之,你的應用程序可能會被徹底破壞。 即使您確實成功地恢復了,您的JVM可能仍然處于堆饑餓狀態(tài),因此您的應用程序將執(zhí)行得很糟糕。
編輯
是什么導致了OOME, 應用程序當時正在做什么,簡單地放棄計算是可以的,并且 一個(大致)同時的OOME不可能發(fā)生在另一個線程上。
添加回答
舉報