3 回答
TA贡献2037条经验 获得超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条经验 获得超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处理程序本身不分配任何内存(任何工具或最佳实践)?
try
private static byte[] reserve = new byte[1024 * 1024]; // Reserves 1MB.
} catch (OutOfMemoryException e) { reserve = new byte[0]; // Ha! 1MB free!}
TA贡献1936条经验 获得超6个赞
OOME也可以抛到其他线程上,包括应用程序甚至不知道的线程。任何这样的线程现在都会死掉,任何等待通知的东西都可能永远被卡住。简而言之,你的应用程序可能会被彻底破坏。 即使您确实成功地恢复了,您的JVM可能仍然处于堆饥饿状态,因此您的应用程序将执行得很糟糕。
编辑
是什么导致了OOME, 应用程序当时正在做什么,简单地放弃计算是可以的,并且 一个(大致)同时的OOME不可能发生在另一个线程上。
添加回答
举报