`

诡异的JVM Crash之EXCEPTION_STACK_OVERFLOW

    博客分类:
  • jvm
阅读更多
关于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。


static testCrash()V
   L0
    LINENUMBER 13 L0
    ACONST_NULL
    CHECKCAST [Ljava/lang/Object;
    ASTORE 0
   L1
    LINENUMBER 14 L1
    ICONST_0
    ISTORE 1
   L2
    LINENUMBER 15 L2
    NEW java/lang/Object
    DUP
    INVOKESPECIAL java/lang/Object.<init>()V
    ASTORE 2
   L3
    LINENUMBER 17 L3
   FRAME APPEND [[Ljava/lang/Object; I java/lang/Object]
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 0
    AASTORE
    ASTORE 0
   L4
    LINENUMBER 19 L4
    IINC 1 1
   L5
    LINENUMBER 20 L5
    ILOAD 1
    SIPUSH 1000
    IREM
    IFNE L3
   L6
    LINENUMBER 21 L6
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ILOAD 1
    INVOKEVIRTUAL java/io/PrintStream.println(I)V
   L7
    LINENUMBER 16 L7
   FRAME SAME
    GOTO L3
   L8
    LOCALVARIABLE o [Ljava/lang/Object; L1 L8 0
    LOCALVARIABLE line I L2 L8 1
    LOCALVARIABLE a Ljava/lang/Object; L3 L8 2
    MAXSTACK = 4
    MAXLOCALS = 3


static testCrash()V
   L0
    LINENUMBER 13 L0
    ACONST_NULL
    CHECKCAST [Ljava/lang/Object;
    ASTORE 0
   L1
    LINENUMBER 14 L1
    ICONST_0
    ISTORE 1
   L2
    LINENUMBER 15 L2
    NEW java/lang/Object
    DUP
    INVOKESPECIAL java/lang/Object.<init>()V
    ASTORE 2
   L3
    LINENUMBER 24 L3
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 0
    AASTORE
    ASTORE 0
   L4
    LINENUMBER 25 L4
    RETURN
   L5
    LOCALVARIABLE o [Ljava/lang/Object; L1 L5 0
    LOCALVARIABLE line I L2 L5 1
    LOCALVARIABLE a Ljava/lang/Object; L3 L5 2
    MAXSTACK = 4
    MAXLOCALS = 3


static testCrash()V
   L0
    LINENUMBER 13 L0
    ACONST_NULL
    CHECKCAST [Ljava/lang/Object;
    ASTORE 0
   L1
    LINENUMBER 15 L1
    NEW java/lang/Object
    DUP
    INVOKESPECIAL java/lang/Object.<init>()V
    ASTORE 1
   L2
    LINENUMBER 24 L2
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 0
    AASTORE
    ASTORE 0
   L3
    LINENUMBER 25 L3
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 0
    AASTORE
    ASTORE 0
   L4
    LINENUMBER 26 L4
    RETURN
   L5
    LOCALVARIABLE o [Ljava/lang/Object; L1 L5 0
    LOCALVARIABLE a Ljava/lang/Object; L2 L5 1
    MAXSTACK = 4
    MAXLOCALS = 2


now the last

// access flags 8
  static testCrash()V
   L0
    LINENUMBER 13 L0
    ACONST_NULL
    CHECKCAST [Ljava/lang/Object;
    ASTORE 0
   L1
    LINENUMBER 24 L1
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 0
    AASTORE
    ASTORE 0
   L2
    LINENUMBER 25 L2
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 0
    AASTORE
    ASTORE 0
   L3
    LINENUMBER 26 L3
    RETURN
   L4
    LOCALVARIABLE o [Ljava/lang/Object; L1 L4 0
    MAXSTACK = 4
    MAXLOCALS = 1

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics