我们公司几次JVM培训都讲到了OutOfMemory问题,大家都在争论OutOfMemoryError是否一定导致JVM crash。让我们用一个非常简单的例子来说明这个问题:package com.webex.joe;
public class OutOfMemoryTest {
public static void main(String[] args) {
int size = 10000;
while (true) {
try {
byte[] obj = new byte[size];
System.out.println("申请内存正常,size=" + size);
size *= 10;
} catch (Throwable e) {
if (e instanceof OutOfMemoryError) {
size /= 10;
}
e.printStackTrace();
}
}
}
}
打印的结果将如下:
java.lang.OutOfMemoryError: Java heap space
申请内存正常,size=10000000
java.lang.OutOfMemoryError: Java heap space
申请内存正常,size=10000000
java.lang.OutOfMemoryError: Java heap space
申请内存正常,size=10000000
java.lang.OutOfMemoryError: Java heap space
很明显,即使出现OutOfMemoryError,也有可能恢复到正常状态,只是一般说来出现这样的问题比较难于恢复罢了。