JVM如何处理StackOverflowError

如何模拟StackOverflowError,可以参考:
http://blog.csdn.net/u011983531/article/details/63250882

我们知道,当虚拟机栈容量太小或者栈帧太大时,程序都会抛出StackOverflowError异常,对于StackOverflowError的处理方法,有下面两种:

  1. 通过try…catch(Throwable t){}来捕获,然后跟普通异常一样,对StackOverflowError进行处理
  2. 不捕获,然后交给JVM处理,JVM此时会中断当前线程,但是不会影响其他线程,因为虚拟机栈是每个线程私有的

下面,我们分别来模拟一下两种方法:

1.捕获StackOverflowError

public class SOFTest {

    public static void main(String[] args) {
        new Thread(new SOFClass(),"Sub thread").start();
        while (true){
            System.out.println("I am main thread!");
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private static class SOFClass implements Runnable{

        @Override
        public void run() {
            try {
                recursiveMethod();
            }catch (Throwable throwable){
                System.out.println("捕获到了异常:"+ throwable.getClass());
            }
            while (true){
                System.out.println("I am sub thread!");
                try {
                    Thread.sleep(1000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

        public void recursiveMethod(){
            recursiveMethod();
        }
    }
}

//运行结果
I am main thread!
捕获到了异常:class java.lang.StackOverflowError
I am sub thread!
I am main thread!
I am sub thread!
I am main thread!
I am sub thread!
I am main thread!
I am sub thread!

2.JVM处理StackOverflowError

下面,我们不捕获StackOverflowError异常,当我们没有捕获时,异常就交给了JVM去处理了。

public class SOFTest {

    public static void main(String[] args) {
        new Thread(new SOFClass(),"Sub thread").start();
        while (true){
            System.out.println("I am main thread!");
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private static class SOFClass implements Runnable{

        @Override
        public void run() {
            recursiveMethod();
       }

        public void recursiveMethod(){
            recursiveMethod();
        }
    }
}

//运行结果
I am main thread!
Exception in thread "Sub thread" java.lang.StackOverflowError
    at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37)
    at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37)
    at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37)
    at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37)
    at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37)
    at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37)
    at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37)
    at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37)
    at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37)
    at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37)
    at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37)
    at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37)
    ……
I am main thread!
I am main thread!
I am main thread!
I am main thread!
I am main thread!
……

我们可以看到,JVM中断了Sub thread,但是主线程仍然在运行,没有影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值