`
小滔哥
  • 浏览: 58893 次
  • 性别: 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) 便可以达到这个目的,节约了不小的时间开销,也省了内存。

分享到:
评论

相关推荐

    各种API性能_性能优化技巧

    了解程序中的线程竞争情况对于优化并发性能至关重要: - 通过`ManagementFactory.getThreadMXBean().getThreadInfo(currentThreadId)`可以获得当前线程的信息,包括`blockedTime`、`blockedCount`、`waitedTime`和`...

    Node性能跟踪与稳定性优化

    监测和分析响应时间是评估Node.js应用性能的重要手段。可以通过收集统计周期内的平均响应时间以及响应时间分布情况来判断系统的响应速度是否满足业务需求。对于响应时间较长的情况,需要进一步定位原因。 #### 关注...

    .NET 性能优化方法总结

    因此,在开发.NET应用程序时,需要采取一些措施来优化垃圾回收过程,从而提升程序的整体性能。 **1.1.1 避免不必要的对象创建** - **1.1.1.1 避免循环创建对象**:在循环中反复创建相同的对象是非常低效的做法。...

    ExceptionLog

    1. **异常捕获**:ExceptionLog能够自动捕获应用程序运行期间发生的任何异常,确保不会因为未处理的异常而导致程序意外终止。 2. **日志记录**:工具会将捕获到的异常信息记录到日志文件中,包括异常的完整堆栈跟踪...

    大型网站的性能优化

    - **不要用 `Exception` 控制程序流程**:异常处理不应用于正常的程序流程控制,而应仅用于处理意外情况。 这些优化策略有助于提升大型网站的响应速度和用户体验,同时降低服务器负载,从而确保系统的稳定性和可...

    .net性能优化宝典

    ### .NET性能优化宝典 #### 一、C#语言方面 **1.1 垃圾回收** 垃圾回收机制是.NET运行时自动管理内存的一部分,对于提高程序的性能至关重要。 **1.1.1 避免不必要的对象创建** 在C#中,不必要的对象创建会增加...

    提升Web 应用系统性能研究

    ### 提升Web应用系统性能研究 #### 摘要与背景 随着互联网技术的发展与普及,Web应用系统已经成为人们日常生活中不可或缺的一部分。...未来,随着技术的发展,我们还可以探索更多优化Web应用性能的方法。

    关于web应用系统优化探讨

    #### 提升Web应用性能的方法 ##### 1. 在Servlet的init()方法中缓存数据 - **原理**: 应用服务器初始化Servlet实例后,在客户端请求服务之前,会调用Servlet的`init()`方法。在Servlet的整个生命周期中,该方法仅...

    Uncaught DOMException:

    标题“Uncaught DOMException:”通常出现在JavaScript编程中,指的是在文档对象模型(DOM)操作...在实际应用中,对“Uncaught DOMException:”的处理和性能测试文档的学习都对提升Web开发者的技能和系统性能至关重要。

    Laravel开发-laravel-exception-logger

    "Laravel开发-laravel-exception-logger"项目旨在提供一个跨Laravel应用程序的统一异常日志记录系统,使得开发者可以更有效地追踪、管理和分析应用中的错误。 1. **异常处理**: - Laravel中的异常处理机制遵循PSR...

    java解决nested exception is java.lang.OutOfMemoryError Java heap space

    Java程序在运行过程中可能会遇到各种异常,其中"nested exception is java.lang....然而,优化过程需要结合具体应用的负载情况和资源需求来进行,确保在满足应用性能需求的同时,避免不必要的内存浪费。

    JSP_Servlet应用程序优化的八种方法

    ### JSP_Servlet应用程序优化的八种方法 #### 技术1:在`HttpServlet init()`方法中缓存数据 ...通过实施上述优化策略,可以显著提高JSP/Servlet应用程序的性能和可扩展性,更好地应对日益增长的用户量和请求。

    Exception

    源码分析对于理解软件内部工作原理、优化代码以及排查问题至关重要。而工具的使用则能提升开发效率,帮助快速定位和解决问题。 压缩包内的文件“JS正则表达式大全 - oneJavaer - BlogJava.mht”表明博客内容可能还...

    Android性能优化典范 - 第4季 - 胡凯1

    - **减少不必要的请求**:频繁的网络请求会影响应用性能,尤其是在更新界面信息时。应合理规划同步服务器数据的频率,避免过度更新。可以采用后台任务或定时器进行智能调度,只在必要时发送请求。 - **利用推送...

    介绍Oracle应用开发方法和技巧

    了解PL/SQL的变量声明、流程控制(IF, CASE, LOOP)、异常处理(EXCEPTION)以及游标操作对提升应用程序性能至关重要。 3. 数据库设计:在开发Oracle应用前,需进行严谨的数据库设计。这包括实体关系模型(ER图)、...

    ORACLE数据库相关资料(性能优化、存储过程)

    Oracle数据库是全球广泛...通过深入学习和实践这些知识点,你可以更好地理解和优化Oracle数据库的性能,同时掌握如何编写和使用存储过程来增强数据库应用的功能和效率。这些资料将是你提升Oracle技术能力的重要资源。

    asp.net程序性能优化的七个方面

    ### ASP.NET程序性能优化的七个方面 在ASP.NET应用程序开发过程中,为了提高...以上七个方面涵盖了ASP.NET程序性能优化的关键点,开发者可以根据具体应用场景灵活选择合适的优化策略,从而提高应用程序的整体性能。

Global site tag (gtag.js) - Google Analytics