`
小滔哥
  • 浏览: 58069 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

了解Exception,优化应用性能

 
阅读更多
  •    1.从Exception往上介绍相关结构、代码

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

    fillInStackTrace 函数的声明为

public synchronized native Throwable fillInStackTrace(); 

    这是个 native 方法。

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

 

Java_java_lang_Throwable_fillInStackTrace(JNIEnv *env, jobject throwable)
{
    JVM_FillInStackTrace(env, throwable);
    return throwable;
}

JVM_ENTRY(void, JVM_FillInStackTrace(JNIEnv *env, jobject receiver))
  JVMWrapper("JVM_FillInStackTrace");
  Handle exception(thread, JNIHandles::resolve_non_null(receiver));
  java_lang_Throwable::fill_in_stack_trace(exception);
JVM_END

void java_lang_Throwable::fill_in_stack_trace(Handle throwable, TRAPS) {
  if (!StackTraceInThrowable) return;
  ResourceMark rm(THREAD);

  ……………………………………………….
  BacktraceBuilder bt(CHECK);
  ………………………………………………
  for (frame fr = thread->last_frame(); max_depth != total_count;) {
    methodOop method = NULL;
    int bci = 0;
  ………………………………………………
    bt.push(method, bci, CHECK);
    total_count++;
  }

  // Put completed stack trace into throwable object
  set_backtrace(throwable(), bt.backtrace());
}

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

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

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

 

XXXException extends Exception {

  public void  synchronized fillInStackTrace(){}

  …

}

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

  • 2.后记

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

分享到:
评论

相关推荐

    .net性能优化宝典

    1. C#语言方面... 4 1.1 垃圾回收... 4 1.1.1 避免不必要的对象创建...... 1.1.2 不要使用空析构函数 ★....4.1 JScript性能优化的基本原则... 24 4.2 JScript语言本身的优化... 24 4.3 DOM相关... 27 4.4 其他... 28

    高性能高并发服务器架构

    2. 避免使用错误的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace消耗性能,除非必要不要使用 instanceof做条件判断,尽量使用比的条件判断方式.使用JAVA中效率高的类,比如ArrayList比Vector性能好...

    Java高并发高性能分布式框架从无到有微服务架构设计(1).doc

    避免使用错误的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace 消耗性能,除非必要不要使用 instanceof做条件判断,尽量使用比的条件判断方式.使用JAVA中效率高的类,比如Array List比Vector性能好....

    sitemapims-donet

    另外由于C#对Exception(异常)处理、内存管理优化等采用的多项先进技术,使基于C#开发的SiteMapIMS-DOTNET稳定性大大加强。 主要有以下七大特点: 1、采用先进的技术 ;2、支持多种数据格式;3、贴近用户的人性化图形...

    超级有影响力霸气的Java面试题大全文档

    抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确...

    Oracle DBA 参考手册

    10.1.1. 性能优化的内容 48 10.1.2. 不同类型系统的优化 48 10.1.2.1. 在线事务处理信息系统(OLTP) 48 10.1.2.2. 数据仓库系统(Data Warehousing) 48 10.2. SQL语句的优化 48 10.2.1. SQL语句的优化规则 48 ...

    asp.net知识库

    优化后的通用分页存储过程 sql语句 一些Select检索高级用法 SQL server 2005中新增的排序函数及应用 根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 生成器 将表数据生成SQL脚本的...

    C#实训教程

    10.11 使用指针优化性能 213 10.12 内容总结 217 11 泛型 218 11.1 泛型的概念 218 11.2 使用泛型 219 11.3 可空类型 219 11.4 运算符和可空类型 220 11.5 System.Collections.Generic命名空间 227 11.6 ...

    Spring面试题

    6. 如何优化Hibernate? 1.使用双向一对多关联,不使用单向一对多 2.灵活使用单向一对多关联 3.不用一对一,用多对一取代 4.配置对象缓存,不使用集合缓存 5.一对多集合使用Bag,多对多集合使用Set 6. 继承类使用...

    PHP和MySQL WEB开发(第4版)

    15.3 易用性,性能、成本和安全性 15.4 建立一个安全政策 15.5 身份验证原则 15.6 加密技术基础 15.6.1 私有密钥加密 15.6.2 公有密钥加密 15.6.3 数字签名 15.7 数字证书 15.8 安全的Web服务器 15.9 审计与日志...

    PHP和MySQL Web开发第4版pdf以及源码

    15.3 易用性,性能、成本和安全性 15.4 建立一个安全政策 15.5 身份验证原则 15.6 加密技术基础 15.6.1 私有密钥加密 15.6.2 公有密钥加密 15.6.3 数字签名 15.7 数字证书 15.8 安全的Web服务器 15.9 审计...

Global site tag (gtag.js) - Google Analytics