Java异常(exception)性能优化

Java异常处理深入解析与实战指南 Java作为一门成熟且功能强大的编程语言,其内置的异常处理机制允许开发者以结构化的方式处理运行时错误。异常类型是Java异常处理的核心组成部分,它定义了程序在运行时可能遇到的问题类别。理解不同的异常类型对于编写健壮的应用程序至关重要。在Java中,所有的异常类都继承自Throwable类,其中Error和Exception是两个主要的分支。Error类用于表示严重的错误,通常是程序无法处理的,如系统错误、资源不足等。而Exception。 阅读详情

在Java中,构造异常对象是”十分”耗时的,其原因是在默认情况下,创建异常对象时会调用父类Throwable的fillInStackTrace()方法生成栈追踪信息,JDK中的源码如下:

public synchronized Throwable fillInStackTrace() {
        if (stackTrace != null ||
            backtrace != null /* Out of protocol state */ ) {
            fillInStackTrace(0); // native方法
            stackTrace = UNASSIGNED_STACK;
        }
        return this;
    }

在我自己做的测试中,new一个带有栈追踪信息的Exception对象要比创建不带追踪信息的对象慢50倍以上。虽然打印调用栈能够精确定位到错误发生的代码所在行,但我们可以考虑一下,真的有必要让所有异常都生成这些信息吗?

我们在开发业务系统的过程中一般都会使用异常机制来实现错误处理逻辑,这些异常通常都可以分成两大类:

  • 业务异常
    这些是我们自定义的、可以预知的异常,抛出这种异常并不表示系统出了问题,而是正常业务逻辑上的需要,例如用户名密码错误、参数错误等。

  • 系统异常
    往往是运行时异常,比如数据库连接失败、IO失败、空指针等,这种异常的产生多数表示系统存在问题,需要人工排查定位。

其实对于业务异常,我们只需要简单的知道一个描述问题的字符串即可,栈追踪信息对我们的意义并不大。而对于系统异常,追踪信息才是排查错误不可或缺的参考。因此我们可以想办法控制一下,创建业务异常时不生成调用栈追踪信息以降低开销,系统异常则正常生成。

其实方法非常简单,在我们自定义异常时,只需要重写父类的一个带有4个参数的构造方法即可,此方法在Exception和RuntimeException类中都存在:

protected RuntimeException(String message, Throwable cause,
                               boolean enableSuppression,
                               boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }

这几个参数的意义如下:

  • message
    异常的描述信息,也就是在打印栈追踪信息时异常类名后面紧跟着的描述字符串
  • cause
    导致此异常发生的父异常,即追踪信息里的caused by
  • enableSuppress
    关于异常挂起的参数,这里我们永远设为false即可
  • writableStackTrace
    表示是否生成栈追踪信息,只要将此参数设为false, 则在构造异常对象时就不会调用fillInStackTrace()

例如,业务异常可以这样定义:

public class XXXException extends RuntimeException {
    /**
     * 仅包含message, 没有cause, 也不记录栈异常, 性能最高
     * @param msg
     */
    public XXXException(String msg) {
        this(msg, false);
    }

    /**
     * 包含message, 可指定是否记录异常
     * @param msg
     * @param recordStackTrace
     */
    public EngineException(String msg, boolean recordStackTrace) {
        super(msg, null, false, recordStackTrace);
    }

    /**
     * 包含message和cause, 会记录栈异常
     * @param msg
     * @param cause
     */
    public EngineException(String msg, Throwable cause) {
        super(msg, cause, false, true);
    }
}

即通过使用父类中4参数的构造方法精确控制异常类的行为。当我们想要创建”轻量级”异常时,使用第一个构造方法即可;如果我们想将系统级异常封装成一下,并希望在日志中打印栈追踪时,就使用第三个构造方法。

PS: 只有在高并发系统中做上述优化才会有明显效果。如果抛异常不频繁的话也不会有明显效果,因为即便是慢50倍,实际也是纳秒级的区别,对一个请求处理来说微不足道。

浅谈JAVA 异常对于性能的影响 Java的异常处理为什么会影响性能?异常开销很大。那么,这是不是就意味着您不该使用异常?当然不是。但是,何时应该使用异常,何时又不应该使用异常呢?不幸的是,答案不是一下子就说得清楚的,我们来详细探讨下。 立即下载

相关推荐

运放 + MOS管构成的恒流电路分析及实用环境器件参数选择

恒流电路

五花带点肉 2万+

如何优化Java异常的效率?

1. 前言 在Java语言中,正如Object是所有对象的父类一样,Throwable是所有异常的父类。为什么会有异常类呢?程序是人开发出来的,而人难免是会犯错误的,因此程序可能会运行异常。一旦发生了异常,开发者首先要做的就是定位异常,然后解决异常。 如何解决异常那是开发者要做的事情,如何让开发者快速定位到异常,却是Java语言本身的职责。 ​ 因此,异常的基类Throwable有一个非常重要的属性【stackTrace】,它代表出现异常时,当前线程运行的堆栈信息。通过它,可以快速定位到该异常是在哪个类的哪

程序员小潘 865

LPDDR4协议规范之 (四)命令和时序

LPDDR4协议规范之 (四)命令和时序命令真值表激活操作读写访问操作读前沿和后沿突发读取操作流程读操作时序写前沿和后沿突发写操作写入均衡(待更新) 命令真值表 激活操作 ACTIVATE命令由两个连续命令组成,Activate-1命令和Activate-2。通过在(Activate-1)时钟的第一个上升沿保持CS HIGH,CA0 HIGH和CA1 LOW来发出Activate-1命令,通过...

YJFeiii的博客 2万+

java异常耗时原因

首先看源码 : public synchronized Throwable fillInStackTrace() { if (stackTrace != null || backtrace != null /* Out of protocol state */ ) { fillInStackTrace(0); ...

weixin_30699955的博客 374

从数据到特征:基于CAT12的MRI图像预处理实战指南

本文详细介绍了使用CAT12工具进行MRI图像预处理的完整实战流程。从数据获取、环境搭建到核心的AC-PC校正、组织分割、空间标准化与调制,逐步解析如何将原始脑影像数据转化为可用于机器学习的标准化特征图。重点阐述了预处理作为脑影像分析‘生命线’的重要性,并提供了避坑指南与自动化脚本建议,帮助研究者构建高质量的阿尔茨海默症分类模型输入特征。

weixin_29065959的博客 308

vasp-自旋轨道耦合(SOC)计算步骤

在VASP中执行自旋轨道耦合(SOC)计算,具体的计算步骤如下: 结构优化获取CONTCAR文件 自洽计算(collinear normal VASP calculations)获取IBZKPT,CHGCAR和WAVECAR文件。 SCF+SOC计算,在此步骤中,将步骤2中的IBZKPT复制为KPOINTS,以便两个步骤具有相同的k网格,因此可以读取步骤2中的CHGCAR和WAVECAR文件。 能带结构计算,在此步骤中,将KPOINTS改为高对称点,读取步骤3中的CHGCAR和WAVECAR文件。

懒散的鱼与消失的猫 3万+

java异常对性能的影响

在java中,Exception一般被认为是比较影响性能的,因此不能作为常规代码使用,而是仅仅用于处理异常情况。那么,异常到底对程序的性能有多大的影响呢? 找了一些中文资料,写的不是很严谨,这篇文章Performance Effects of Exceptions in Java的方法比较好一些,可以作为参考。 从结论上看,一旦产生异常,整体耗时都会比正常程序高很多。所以,平常使用Exception要比较谨慎,只在处理异常情况的场景下使用,否则会影响性能。 ...

lijianqingfeng的专栏 1723

基于ADPSS的直驱风电单机模型建模指南:跟网型与构网型

本文介绍了基于ADPSS平台的直驱风电单机建模方法,包含跟网型和构网型两种控制策略。模型采用模块化设计,共享风力机与桨距角控制部分,通过FORTRAN语言实现自定义建模。跟网型采用锁相环同步和矢量控制,构网型则采用虚拟同步机技术模拟同步发电机特性。详细阐述了风力机气动模型、桨距角控制算法及代码实现,为新能源并网仿真提供了实用参考。全文约150字,涵盖模型架构、数学方程和ADPSS实现要点。

huanghm88的专栏 168

ArrayList、LinkedList、HashMap、TreeMap 存储速度对比

1、百 级别的数据(100) 2、千 级别的数据(1000) 3、万 级别的数据(10000) 4、十万 级别的数据(100000) 5、百万 级别的数据(1000000) 6、千万 级别的数据(10000000) 附上代码: public static void m...

weixin_30752699的博客 370

光学传播仿真软件:SPEOS_(14).建筑物内光环境仿真

在建筑物内光环境仿真中,材料属性的定义直接影响光的传播和反射效果。SPEOS提供了丰富的材料库,但也可以自定义材料属性以满足特定需求。创建新材料选择Materials->。输入材料名称和类型。配置材料属性选择材料对象,打开属性编辑器。设置反射率、透射率、表面粗糙度和颜色。# 导入SPEOS模块# 创建新材料# 配置材料属性custom_material.set_reflectivity(0.8) # 设置反射率为0.8。

kkchenjj的博客 1243

科研必备:15款顶尖AI科研工具全面分析汇总(持续更新ing)

科研必备:15款AI科研工具全面分析汇总(持续更新ing)

Code_流苏:在代码中寻诗意,在实践中觅真知 9629

java 异常的效率_JAVA 异常对于性能的影响

陶炳哲 — MAY 12, 2015在对OneAPM的客户做技术支持时,我们常常会看到很多客户根本没意识到的异常。在消除了这些异常之后,代码运行速度与以前相比大幅提升。这让我们产生一种猜测,就是在代码里面使用异常会带来显著的性能开销。因为异常是错误情况处理的重要组成部分,摒弃是不太可能的,所以我们需要衡量异常处理对于性能影响,我们可以通过一个实验看看异常处理的对于性能的影响。实验我的实验基于一段随...

weixin_42519489的博客 518

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java 异常 效率_Java异常(exception)性能优化

在Java中,构造异常对象是"十分"耗时的,其原因是在默认情况下,创建异常对象时会调用父类Throwable的fillInStackTrace()方法生成栈追踪信息,JDK中的源码如下:public synchronized Throwable fillInStackTrace() {if (stackTrace != null ||backtrace != null /* Out of prot...

weixin_42412850的博客 555

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

重学Java异常体系

在 Java 中,通常情况下已有的内置异常类能够满足应用的基础使用需求。但有些情况下,需要自定义异常来满足特别的需求。最常见的就是用精确的命名描述异常例如,某个特定case的异常,让它见名知意。当程序需要对异常情况进行更加具体和准确的描述时,可以自定义异常类。如何自定义异常就不多描述了,这里着重说一点关于自定义异常时需要注意的地方。

ljheee的博客 395

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Exception和Error的区别

Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态 Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。...

茶半香初 6996

理解Java异常转译的强大

原文在我知识库中 知识储备: java中Exception是异常的顶级父类,不管是checked exception还是RuntimeException都继承自它。 那么在何种情况下是checkedException,何种情况下是RuntimeException呢? 一般地,继承自Exception的类,或者继承非RuntimeException的Exception子类的类(如继承

小小懒羊羊 2316

Java异常处理--啥是异常?

可以看到,它继承了RuntimeException,RuntimeException代表运行时异常。RuntimeException又继承了Exception,Exception可以认为是最顶层的异常。这个抛异常的行为是jdk帮忙做的,异常的好处就是告诉我们代码哪错了?##步骤 2 怎么自己观测空指针异常?上个步骤,空指针异常的抛出不是我们做的,是jdk做的。那么,我们自己怎么控制这个异常呢?看我的写法:try{cst.eat();

2301_82244623的博客 634

Java(异常)

Error:代表的系统级别错误(属于严重问题,系统一旦出现问题,sun公司会把这些错误封装成Error对象,Error是给sun公司自己用的,不是给我们程序员用的。运行时异常:RuntimeException及其子类,编译阶段不会出现异常提醒。运行时出现的异常(如:数组索引越界异常)Exception:叫做异常,代表程序可能出现的问题,我们通常会用Exception以及他的子类来封装程序出现的问题,Java不会运行代码,只会检查语法是否错误,或者做一些性能的优化。编译时异常:编译阶段就会出现异常提醒的。

qq_63126439的博客 454

Java异常处理最佳实践从checkedexception到try-with-resources的精髓解析

Java异常处理的最佳实践是一个不断演进的主题,从强制处理的Checked Exception到自动资源管理的Try-With-Resources,体现了Java语言在可靠性和开发效率之间的平衡。从传统的Checked Exception到现代的Try-With-Resources语句,Java异常处理的最佳实践经历了显著演进。最后,优先使用特定的异常类型,而不是通用的Exception类,这样可以提供更精确的错误信息。同时,确保异常类提供足够的上下文信息,但避免存储过大的数据对象,以免增加内存开销。

GuihongMa的专栏 372

Java基础知识总结(异常机制、集合、JUC、IO)

1、Java异常以及常用工具类体系。异常处理机制主要回答了三个问题?   答:1)、第一个是异常类型回答了什么被抛出。     2)、第二个是异常堆栈跟踪回答了在哪里抛出。     3)、第三个是异常信息回答了为什么被抛出。Throwable是所有异常体系的顶级父类,包含了Error类和Exception类。从概念角度分析Java的异常处理机制。 2、Java的异常体系,Error和...

Biexiansheng的博客 770

Catch-Exception: 异常捕获的简便解决方案

Catch-Exception: 异常捕获的简便解决方案 1. 项目基础介绍 Catch-Exception 是一个开源项目,旨在为Java开发者提供一个简单、便捷的方式来捕获和验证异常。该项目的编程语言为Java。 2. 核心功能 该项目的主要功能是允许开发者在单行代码中捕获异常,并进行后续的分析。这使得代码更加简洁,易于维护。以下是它的核心功能: 单行捕获异常:通过一行代码即可捕获方法调用中...

gitblog_00382的博客 348

Java异常处理

/ 支付异常(继承RuntimeException)// 异常附加信息异常处理核心要点理解异常分类:明确Error/Checked/Unchecked的区别选择合适的异常类型:业务异常优先使用RuntimeException保持异常信息完整:包含业务上下文和原始异常全局异常处理:统一REST API错误格式性能优化方向避免在循环内部抛出异常高频调用路径禁用异常控制流使用预检查替代异常捕获:// 优化前try {// 处理越界// 优化后} else {

weixin_44343004的博客 1067

Java异常处理机制:Error与Exception深度解析

异常处理是Java编程中的核心概念,其本质是通过面向对象的方式管理程序运行时的非预期情况。Java异常体系采用树状结构设计,顶层Throwable分为Error和Exception两大分支,分别对应系统级错误和应用级异常。理解这种分层设计原理,能帮助开发者编写更健壮的代码。在工程实践中,合理的异常处理策略包括精确捕获、异常链传递、与日志系统配合等关键技术,这些方法能显著提升系统可维护性。特别是在高并发、分布式系统等场景下,正确处理OutOfMemoryError等系统错误和IOException等应用异常尤

weixin_30512965的博客 246
上一篇: @FeignClient同一个name使用多个配置类的解决方案
下一篇: 如何裸写或利用Spring扫描出指定包下的所有类名
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值