使用异常捕获的代码为什么比较耗费性能?

       因为构造异常的实例比较耗性能。这从代码层面很难理解,不过站在JVM的角度来看就简单了,因为JVM在构造异常实例时需要生成该异常的栈轨迹。这个操作会逐一访问当前线程的栈帧,并且记录下各种调试信息,包括栈帧所指向方法的名字,方法所在的类名、文件名,以及在代码中的第几行触发该异常等信息。

       当你new一个exception的时候,jvm已经在exception里构建好了所有的stacktrace(BacktraceBuilderbt),这里花费的代价是可观的,试想一下,在web项目中,调用栈的深度可是很大的。因此,当你对stacktrace不感兴趣的时候,不需要这样的信息时,最好不要随便的new exception。
这里介绍一个常用的避免这种问题的相应的解决方法,即不需要stacktrace信息时,抛自己定义的特殊excepion。
自定义TestException,覆盖掉native的那个函数,构造一个空的函数即可,具体实现如下。
代码  
TestException extends Exception { 
      public void  synchronized fillInStackTrace(){} 
}
然后throw exception的时候,抛自定义的TestException就好了,这样会大大的提高效率,也节省了空间。

 

你可能感兴趣的:(JVM)