你,你们能,会,可以从它中恢复过来: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;
}
}
}}
但这有意义吗?你还想做什么?你最初为什么要分配那么多内存?内存少也可以吗?你为什么不好好利用它呢?或者如果这是不可能的,为什么不从一开始就给JVM更多的内存呢?
回到你的问题:1:捕捉java.lang.OutOfMemoryError可能是个好主意。
没人会想到。2:如果我们捕获java.lang.OutOfMemoryError,如何确保CATCH处理程序本身不分配任何内存(任何工具或最佳实践)?
这取决于是什么导致了OOME。如果它被声明在try一步的发生,那么你的机会就很小了。你,你们可以,可能想事先预留一些内存空间:private static byte[] reserve = new byte[1024 * 1024]; // Reserves 1MB.
然后在OOME期间将其设置为零:} catch (OutOfMemoryException e) {
reserve = new byte[0];
// Ha! 1MB free!}
当然,这完全没有意义;)只要根据应用程序的需要给JVM足够的内存即可。必要时运行分析器。