Exception对性能的影响

本文深入探讨了在异常处理过程中,如何通过构造方法调用`fillInStackTrace()`来保存运行时栈快照,以及这一操作对性能的影响。详细解释了运行时栈的工作原理,包括其在调用顺序上的作用,以及异常处理时打印调用栈信息的必要性。同时,文章还分析了`printStackTrace()`方法背后的实现细节,以及它如何将错误信息打印到标准错误流中。

我们知道,当程序发生异常时,会通过new调用异常的构造方法,在堆内存区域创建一个异常实例。而构造方法都是默认调用基类的Throwalbe的构造方法,下面我们看一下代码:

    public Throwable() {
        fillInStackTrace();
    }

    public Throwable(String message) {
        fillInStackTrace();
        detailMessage = message;
    }

 可以看到,基类的构造方法中都调用了 一个叫fillInStackTrace()的方法,而这个方法的作用,便是用来保存运行时栈的快照,以便在处理异常时打印出调用栈信息。

 

这里先解释一下运行时栈。jvm在执行代码时,会将代码的调用按顺序依次压入栈中,比如一般的action+service+dao的结构,栈底就是action的代码,中间是service,栈顶是dao,然后pop出来执行。中间不会任何停顿。

 

而当发生Exception时,需要将此时运行时栈hold住,并保存一份快照,这对性能的影响是非常大的。

 

另外,在进行异常处理时,一般为了便于查找异常的原因,程序员都会调用e.printStrackTrace()来打印异常信息。再来看一下代码:

 public void printStackTrace() {
        printStackTrace(System.err);
    }

    public void printStackTrace(PrintStream s) {
        synchronized (s) {
            s.println(this);
            StackTraceElement[] trace = getOurStackTrace();
            for (int i=0; i < trace.length; i++)
                s.println("\tat " + trace[i]);

            Throwable ourCause = getCause();
            if (ourCause != null)
                ourCause.printStackTraceAsCause(s, trace);
        }
    }

 

可以发现,实际上是将错误信息交给了标准的错误流打印出来,同样也会有性能影响。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值