诡异的JVM Crash之EXCEPTION_STACK_OVERFLOW
关于JVM的一个常识是:如果对象被意外地持有很容易造成内存泄漏,而如果同时又在不停地生成新对象,就有很大的机率造成内存溢出。通常情况下,这种溢出会导致JVM抛出OutOfMemoryError,然后JVM挂起。
可是来试试下面的代码,真是让人有点诧异,分别在JDK1.4、JDK5、JDK6上都表现一致。
package crash;
public class JVMCrashTest {
public static void main(String[] args) {
try {
testCrash();
} catch (Throwable t) {
t.printStackTrace();
System.out.println("catch an exception! I'm dead!");
}
}
/**
* JVM挂掉,core dump
*/
static void testCrash() {
Object[] o = null;
int line = 0;
while (true) {
o = new Object[] { o };
line++;
if (line % 1000 == 0) {
System.out.println(line);
}
}
}
}
没有机会抓异常,JVM直接Crash。Windows上会有hs_err日志产生,好一个EXCEPTION_STACK_OVERFLOW。Linux上面连日志都没有,直接segment fault。 |