`
MauerSu
  • 浏览: 514580 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

消除Java应用中的Exception开销

 
阅读更多
源:http://blog.hesey.net/2013/11/eliminate-exception-overhead-in-java.html
评:


抛异常最大的消耗在于构造整个异常栈的过程,如果你的栈很深,特别是用了一些框架的话,这个开销基本是不可忽视的,之前做的一个优化显示当时应用中的一个异常使得整个应用的性能下降至少30%。
一、开销在哪

    最大开销的地方在这里,当你去new一个Exception的时候,会调用父类Throwable的构造函数,Throwable的构造函数中会调用native的fillInStackTrace(),这个方法就会构造整个异常栈了。

二、优化方案

    要优化这个地方,最简单的方案有两种:

    1、去掉异常栈构造

        如果你的Exception是自定义类型的,你很清楚什么情况哪行代码会抛出这个Exception,例如限流或者拒绝服务了。那么你可以给你的Exception Class重写fillInStackTrace()这个方法,搞一个空的实现就可以了,这样构造函数去调的时候就不会真正去调那个native的方法。抛异常的开销就没那么大了。


    2、去掉异常

        更推荐的做法是去看你到底是不是真的需要抛异常,把没有意义的异常去掉。例如之前见过有代码用异常流来实现正常的业务逻辑的,这种性能就很差了,因为你每次调用都会至少抛一个异常,并发量大的时候对性能影响非常大。

三、寻找异常

    有时候你可能无法直接找到到底哪个异常抛得最多,最典型的是引入了一个三方包,它里面自己抛了异常然后又自己catch住了,外面压根不知道里面居然还有这些破事儿。

    可以用perf top去看下us的开销,如果_ZN19java_lang_Throwable19fill_in_stack_traceE6HandleP6Thread这个排名很靠前,那就有必要看看异常的大头在哪里。

    最简单的用BTrace去跟一下Exception.<init>看构造Exception的栈是什么样的,然后排序汇总一下,一般就能看到什么Excetion最多,是谁抛的,然后有针对性地把它们去掉或者优化掉。

然后再压测你的应用,对CPU的开销会减少不少。
分享到:
评论

相关推荐

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

    Java程序在运行过程中可能会遇到各种异常,其中"nested exception is java.lang.OutOfMemoryError: Java heap space"是一个常见的问题,通常发生在程序试图分配超过堆内存限制的空间时。这个错误表明Java虚拟机(JVM...

    Eclipse运行TOMCAT 出现在a java exception has occurred的解决办法。

    解决"a java exception has occurred"的方法非常简单,只需要在Eclipse中添加tomcat-ujli.jar到classpath中即可。下面是添加tomcat-ujli.jar的步骤: 1. 在Eclipse中双击TOMCAT SERVER,出现"Edit launch ...

    java Exception

    ### Java中的异常处理详解 #### 一、异常基础概述 在Java编程中,异常处理是一项重要的机制,用于处理运行过程中可能发生的错误情况。通过合理的异常处理,可以显著提高程序的健壮性和可用性。 ##### 1. 异常概念...

    Java exception_java_

    首先,我们要了解Java中的异常类型。Java的异常类都继承自`java.lang.Throwable`,主要分为两种类型:Error和Exception。Error是系统级的错误,如虚拟机错误、内存不足等,一般开发者无法处理,而Exception是应用...

    JAVA 自定义异常 Exception

    自定义异常是在Java中通过继承`java.lang.Throwable`或其子类(如`Exception`或`Error`)来实现的。通常,我们选择继承`Exception`类,因为它用于表示程序可以恢复的错误,而`Error`则用于表示系统级的严重问题,...

    java开发exception部分

    java development part of exception

    javaException_JAVA源码_

    在Java中,异常是一种事件,它中断了程序的正常流程。Java异常处理提供了五种关键字来帮助开发者有效地管理异常:`try`, `catch`, `finally`, `throw`, 和 `throws`。 首先,`try`块是用于包含可能抛出异常的代码的...

    java中Exception的细节

    Exception类是Java中异常处理的核心,它位于`java.lang`包中,是所有检查型异常(checked exceptions)和非检查型异常(unchecked exceptions)的基类。本文将深入探讨Java中的Exception细节。 首先,异常分为两种...

    java exception

    在Java中,异常处理通过`try-catch-finally`结构实现。`try`块包含可能会抛出异常的代码,`catch`块用于捕获并处理异常,而`finally`块确保无论是否发生异常,某些代码(如资源清理)总会被执行。 异常可以通过`...

    JAVA Exception Handling & UI Design

    Java中的异常分为两种类型:Checked异常和Unchecked异常。Checked异常是那些在编译时期就需要被处理的异常,比如FileNotFoundException。在编写代码时,如果可能会抛出这些异常,那么必须使用try-catch语句块来捕获...

    java异常exception

    ### Java异常详解 ...了解并掌握这些异常的含义及其处理方法对于编写健壮可靠的Java应用程序至关重要。通过适当的设计和编码实践,可以有效地减少异常的发生,并确保程序能够优雅地处理这些异常情况。

    oracle_10g提示java.lang.Exception_Exception_in_sending_Request__null解决方案

    在使用Oracle 10g的过程中,部分用户可能会遇到一个特定的问题:在登录企业管理器(Enterprise Manager, EM)时,系统会报错“java.lang.Exception: Exception in sending Request :: null”。这个问题虽然不常见,...

    Java中Error与Exception的区别.doc

    Java中Error与Exception的区别 Java 中的 Error 和 Exception 是两个不同的概念,它们都是 Throwable 的子类,但它们之间存在着许多不同之处。 首先, Error 类和 Exception 类都继承自 Throwable 类,这一点是...

    java.text.ParseException: Unparseable date: 2/10/2010 15:20:05

    在Java中,日期和时间的解析是通过 `SimpleDateFormat` 类或者 Java 8 引入的 `java.time.format.DateTimeFormatter` 类来完成的。这些类需要一个模式字符串来定义输入日期字符串的格式,以便正确解析。 例如,如果...

    java 异常 问题收集 Exception

    Java中的异常是程序运行时出现的不正常情况,通常会导致程序中断。Java将异常分为两种类型:检查性异常(Checked Exceptions)和运行时异常(Unchecked Exceptions)。检查性异常在编译阶段需要处理,如IOException...

    java技术及应用

    本文将详细探讨Java技术在个人理财系统中的应用。 首先,我们需要理解Java技术的核心知识点。Java技术包括Java SE(标准版)、Java EE(企业版)、Java ME(微型版)等版本。Java SE提供了Java语言的基础,包括了...

    在Java应用程序中使用MySql

    首先,要在Java中连接MySQL,你需要包含JDBC(Java Database Connectivity)驱动。MySQL官方提供了Connector/J,这是一个符合JDBC API的驱动。将对应的jar文件添加到项目的类路径中是必要的步骤。 接下来,我们讨论...

Global site tag (gtag.js) - Google Analytics