Exception对性能的影响

我们知道,当程序发生异常时,会通过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);
        }
    }

 

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

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值