Exception性能问题

标签: exception 性能 问题 | 发表时间:2014-01-24 22:25 | 作者:san_yun
出处:http://www.iteye.com
  •    1.从Exception往上介绍相关结构、代码

    class Exception里面没有什么新鲜东西,它继承自class Throwable,接下来我们看一下Throwable的结构,在它的构造函数中调用了fillInStackTrace这个函数。接下来我们看看这个函数干了些什么。

    fillInStackTrace函数的声明为

Java代码  
1 public  synchronized  native  Throwable fillInStackTrace();

    这是个native方法。

    然后我们到jdk的代码里去找它的具体实现。

 

代码  
01 Java_java_lang_Throwable_fillInStackTrace(JNIEnv *env, jobject throwable) 
02
03      JVM_FillInStackTrace(env, throwable); 
04      return  throwable; 
05
06    
07 JVM_ENTRY( void , JVM_FillInStackTrace(JNIEnv *env, jobject receiver)) 
08    JVMWrapper( "JVM_FillInStackTrace" ); 
09    Handle exception(thread, JNIHandles::resolve_non_null(receiver)); 
10    java_lang_Throwable::fill_in_stack_ trace (exception); 
11 JVM_END 
12    
13 void  java_lang_Throwable::fill_in_stack_ trace (Handle throwable, TRAPS) { 
14    if  (!StackTraceInThrowable)  return
15    ResourceMark rm(THREAD); 
16    
17    ………………………………………………. 
18    Back trace Builder bt(CHECK); 
19    ……………………………………………… 
20    for  (frame fr = thread->last_frame(); max_depth != total_count;) { 
21      methodOop method = NULL; 
22      int  bci =  0
23    ……………………………………………… 
24      bt.push(method, bci, CHECK); 
25      total_count++; 
26   
27    
28    // Put completed stack trace into throwable object 
29    set_back trace (throwable(), bt.back trace ()); 
30 }

    上面的代码中,这一系列调用可以发现,当你new一个exception的时候,jvm已经在exception里构建好了所有的stacktrace( BacktraceBuilderbt),这里花费的代价是可观的,试想一下,在web项目中,调用栈的深度可是很大的。因此,当你对stacktrace不感兴趣的时候,不需要这样的信息时,最好不要随便的new exception。

    这里介绍一个常用的避免这种问题的相应的解决方法,即不需要stacktrace信息时,抛自己定义的特殊excepion。

    自定义XXXException,覆盖掉native的那个函数,构造一个空的函数即可,具体实现如下。

 

代码  
1 XXXException  extends  Exception { 
2    
3    public  void   synchronized fillInStackTrace(){} 
4    
5    … 
6    
7 }

   然后throw exception的时候,抛自定义的XXXException就好了,这样会大大的提高效率,也节省了空间。

  • 2.后记

    当然做getStackTrace()的代价是蛮大的。曾经遇到一个案例,只需要stacktrace中的某个trace,却要通过getStackTrace()这个函数取到所有的trace,取其中的第i个,这样着实有些不划算。后来我们在jdk中给提供了一个接口StackTraceElementXXXUtils::getStackTraceElement(int index, Throwable t)便可以达到这个目的,节约了不小的时间开销,也省了内存。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [exception 性能 问题] 推荐:

Exception性能问题

- - 非技术 - ITeye博客
   1.从Exception往上介绍相关结构、代码.     class Exception里面没有什么新鲜东西,它继承自class Throwable,接下来我们看一下Throwable的结构,在它的构造函数中调用了fillInStackTrace这个函数. 接下来我们看看这个函数干了些什么.     fillInStackTrace函数的声明为.

Java SE 7 Exception的使用

- - ITeye博客
Java SE 7 Exception的使用. 在Java SE 7 中,作为Project Coin项目中众多有用的细小语言变化之一的加强型异常处理,现在来学习如何利用它. 在这边文章中,我们所涉及的一些变化是作为Java平台标准版7(Java SE 7)所发布,在JSR334(Java Specification Request)有详细的说明.

消除Java应用中的Exception开销

- - 舒の随想日记
抛异常最大的消耗在于构造整个异常栈的过程,如果你的栈很深,特别是用了一些框架的话,这个开销基本是不可忽视的,之前做的一个优化显示当时应用中的一个异常使得整个应用的性能下降至少30%. 最大开销的地方在这里,当你去new一个Exception的时候,会调用父类Throwable的构造函数, Throwable的构造函数中会调用native的fillInStackTrace(),这个方法就会构造整个异常栈了.

redis 性能问题查找

- - 开源软件 - ITeye博客
          使用redis作为数据库时,系统出现少量超时,通过日志信息发现,超时发生在bgsave时. bgsave命令会fork一个子进程,子进程会将redis数据库信息dump到rdb文件中. 因此不能确定使用bgsave命令时,是fork一个子进程引起超时,还是dump文件时与主进程的sync同步同时写磁盘引起的超时.

解决WebLogic启动时BEA-171522异常(启动时报classcast exception)

- - 研发管理 - ITeye博客
If the problem is with the data files and it can not be corrected, backups of previous versions of the data files exist. 在经过多方查证后,发现是由于在项目开发中,曾有项目成员使用root用户启动过WebLogic,造成WebLogic的LDAP文件的权限属性为root:root(前一个为用户,后一个为组),所以在启动的过程中会提示LDAP异常.

Java的Exception和Error面试题10问10答

- - ITeye博客
JAVA 中Exception和Error 面试问题.   下面是我个人总结的在Java和J2EE开发者在面试中经常被问到的有关Exception和Error的知识. 回答的时候,我也给这些问题作了快速修订,并且提供源码以便深入理解. 我总结了各种难度的问题,适合新手码. 如果你遇到了我列表中没有的问题,并且这个问题非常好,请在下面评论中分享出来.

该如何良好的实践Java中的Exception机制

- - BlogJava-首页技术区
首先,我先声明一点,我讨论的仅限于互联网数据产品,当然可能会涉及到一些其他的抽象,但是所有的结论不代表能复用到所有场景.         几乎每个Java程序员都清楚知道Java的异常和错误机制,无论是在面试过程中,还是在学习中,你看到Exception,无非就是了解一下继承关系、子类、和Error的关系等等.

[译]Java中9个处理Exception的最佳实践

- - 后端技术杂谈 | 飒然Hang
在Java中处理异常并不是一个简单的事情. 不仅仅初学者很难理解,即使一些有经验的开发者也需要花费很多时间来思考如何处理异常,包括需要处理哪些异常,怎样处理等等. 这也是绝大多数开发团队都会制定一些规则来规范对异常的处理的原因. 而团队之间的这些规范往往是截然不同的. 本文给出几个被很多团队使用的异常处理最佳实践.

记一次MongoDB性能问题

- Fstone - 火丁笔记
最近忙着把一个项目从MySQL迁移到MongoDB,在导入旧数据的过程中,遇到了些许波折,犯了不少错误,但同时也学到了不少知识,遂记录下来. 公司为这个项目专门配备了几台高性能务器,清一色的双路四核超线程CPU,外加32G内存,运维人员安装好MongoDB后,就交我手里了,我习惯于在使用新服务器前先看看相关日志,了解一下基本情况,当我浏览MongoDB日志时,发现一些警告信息:.

复合索引性能问题初探

- - CSDN博客推荐文章
在《品悟性能优化》一书,4.4.3章节里介绍了复合索引的两个特点:前缀性,可选性. 何为前缀性,该书阐述为排除skip scan index的情况,约束条件如果不包含复合索引的第一列,则该复合索引不会被用到;何为可选性,该书阐述为字段值越多,可选性越强,定位记录越少,查询效率越高. 即查询返回记录少的列应该放在复合索引的前面.