3 回答
TA贡献2037条经验 获得超6个赞
OutOfMemoryErrorOutOfMemoryError
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
ErrorError
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条经验 获得超7个赞
OOME也可以抛到其他线程上,包括应用程序甚至不知道的线程。任何这样的线程现在都会死掉,任何等待通知的东西都可能永远被卡住。简而言之,你的应用程序可能会被彻底破坏。 即使您确实成功地恢复了,您的JVM可能仍然处于堆饥饿状态,因此您的应用程序将执行得很糟糕。
编辑
是什么导致了OOME, 应用程序当时正在做什么,简单地放弃计算是可以的,并且 一个(大致)同时的OOME不可能发生在另一个线程上。
添加回答
举报
