抛出异常的哪一部分成本很高?

2023-12-11

在 Java 中,当实际上没有错误时,使用 throw/catch 作为逻辑的一部分通常是一个坏主意(部分),因为抛出和捕获异常的成本很高,并且在循环中多次执行通常比其他方法慢得多不涉及抛出异常的控制结构。

我的问题是,成本是在 throw/catch 本身中产生的,还是在创建 Exception 对象时产生的(因为它获取了大量运行时信息,包括执行堆栈)?

换句话说,如果我这样做

Exception e = new Exception();

但不要扔它,这是扔的大部分成本,还是扔+捕获处理的成本高?

我不是在问将代码放入 try/catch 块中是否会增加执行该代码的成本,而是在问捕获异常是否是昂贵的部分,或者创建(调用其构造函数)异常是昂贵的部分。

提出这个问题的另一种方式是,如果我创建一个 Exception 实例并一遍又一遍地抛出和捕获它,这会比每次抛出时创建一个新的 Exception 快得多吗?


Creating异常对象不是一定比创建其他常规对象更昂贵。主要成本隐藏在原生成本中fillInStackTrace方法遍历调用堆栈并收集构建堆栈跟踪所需的所有信息:类、方法名称、行号等。

Most of Throwable构造函数隐式调用fillInStackTrace。这就是创建异常很慢的想法的由来。然而,有一个构造函数创建一个Throwable没有堆栈跟踪。它允许您制作可快速实例化的可抛出对象。创建轻量级异常的另一种方法是重写fillInStackTrace.


现在呢throwing例外吗?
事实上,这取决于抛出异常的位置caught.

如果它被捕获在同一个方法中(或者更准确地说,在同一个上下文中,因为上下文可以由于内联而包含多个方法),那么throw既快速又简单goto(当然是在JIT编译之后)。

然而,如果一个catch块位于堆栈较深处的某个位置,那么 JVM 需要展开堆栈帧,这可能需要更长的时间。如果有的话,需要更长的时间synchronized涉及的块或方法,因为展开意味着释放已删除的堆栈帧所拥有的监视器。


我可以通过适当的基准来确认上述陈述,但幸运的是我不需要这样做,因为所有方面都已经在 HotSpot 的性能工程师 Alexey Shipilev 的帖子中完美地涵盖了:Lil' Exception 的卓越表现.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

抛出异常的哪一部分成本很高? 的相关文章

  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • 会话重新启动后 AVcapture 会话启动缓慢

    我有一个主视图控制器 它连接到具有 avcapturesession 的第二个视图控制器 我第一次从主视图控制器转向捕获会话控制器 大约需要 50 毫秒 使用 仪器 检查 然后我从捕获会话返回到主视图控制器 然后从主控制器返回到 avcap
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 如何知道Matlab中系统命令执行过程中经过的时间?

    我有一个运行系统脚本的 Matlab 代码 该脚本可能会因命令运行而停止 我想知道是否有一种方法可以让程序知道它是否花费了很长时间并执行其他操作 这是代码 tic status cmdout system iperfcmd The prog
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类

随机推荐

  • 从 Excel 导入 - 非数字值将被忽略

    我有从指定格式的 Excel 工作表导入的代码 在其中一列中 大多数数据都是数字 但也存在非数字值 由于某种原因 导入代码会忽略非数字值 连接字符串如下所示 Dim FileConnectionString As String Provid
  • 启动 celery Worker 并启用它的广播队列

    我正在尝试启动芹菜工作人员 因此它只侦听单个队列 这不是问题 我可以这样做 python m celery worker A my module Q my queue c 1 但现在我也想要这个my queue队列成为广播队列 所以我在我的
  • 以编程方式将 [AllowAnonymous] 属性添加到我的所有控制器方法

    我有一个带有多个控制器的 WebAPI2 REST api 我使用基于角色的身份验证 我在所有控制器和一些方法上添加了 Authorize 属性 但是 在 DEV 环境中我想禁用身份验证 我希望我可以将一些代码放入WebApiConfig例
  • CORS 错误:“请求仅支持协议方案:http…”等

    我正在尝试运行一个简单的应用程序 我有一个 Express 后端 当访问时返回一个 JSON 字符串localhost 4201 ticker 当我运行服务器并从我的 Angular 服务向此链接发出请求时http 我收到以下错误 XMLH
  • jQuery UI Sortable 手动设置位置

    如何使用一些代码手动设置位置 Ok 我有一些具有 sortable 行为的 div div class sort div div class sort div div class sort div div class sort div di
  • 编码为单字节扩展 ascii 值

    在 C 中 有一种方法可以将扩展 ascii 值 128 255 编码为其单字节值 如下所示 http asciitable com 我尝试过使用 Encoding UTF8 GetBytes 但会返回扩展代码的多字节值 我不需要超过 25
  • MATLAB 中的 {} 和 [] 有什么区别?

    gt gt A 1 2 2 3 A 1 2 2 3 gt gt A 1 2 2 3 A 1 2 2 3 在我看来它们本质上是同一件事 是针对细胞的 用于数组 矩阵
  • 比较两个可选数组时出现 Swift 错误

    I get a 编译错误在下一个 Swift 代码中 var x Array
  • 将十六进制字符串转换为字节数组 (.NET) 的最佳方法是什么?

    我有一个十六进制字符串 需要将其转换为字节数组 最好的方法 即高效和最少的代码 是 string hexstr 683A2134 byte bytes new byte hexstr Length 2 for int x 0 x lt by
  • 如何使用plot_trisurf

    将matplotlib版本从1 3 1更新到2 0 2后 当我想使用plot trisurf通过3d点生成TIN时 我得到了难以理解的结果 我的测试代码如下 import sys import matplotlib import matpl
  • VBA 运行时错误“70”:无法设置列表属性。没有权限

    我试图通过单击列表框来更新数据 但出现错误 请参阅下面的代码 使用下面的代码将列表框值显示到文本框 Private Sub ListBox1 Click Dim i As Integer i Me ListBox1 ListIndex Me
  • Rspec / Shoulda:测试,调用自定义验证器

    我有一个自定义验证器 位于 app validators uri validator rb 中 用于 validates link uri true 我如何在我的规格中指定这一点 理想情况下 我希望进行单线通话 例如 it should v
  • 通过arg执行函数

    我想做的是 当我输入特定参数时 它会启动一个函数 这可以通过argparse 因此 如果我在应用程序中点击 add 参数 它就会触发 add 函数 parser argparse ArgumentParser description to
  • 为什么groupByKey操作总是有200个任务?

    每当我做一个groupByKey在 RDD 上 即使原始表非常大 它也会分为 200 个作业 例如2k 个分区和数千万行 此外 该操作似乎陷入了最后两个任务 这两个任务的计算时间非常长 为什么是200 如何增加它 会有帮助吗 这个设置来自s
  • 如何在Django html页面中显示外键数据?

    我想从相关的外键模型中获取数据 但我无法从相关的模型中获取数据 请告诉我该怎么做 我要显示name价值来自Model2 table 这是我的models py file class Customer models Model cus nam
  • android快速获取所有用户的朋友个人资料图片

    我正在寻找一种快速获取我所有朋友的个人资料照片的方法 我正在使用适用于 Android 的 Facebook SDK 现在我正在获取我朋友的列表 JSON 对象并在该对象内使用 for 循环运行 在循环中 我将每个图像放入 Drawable
  • MVC 6 绑定属性消失了?

    请原谅我的菜鸟问题 但我注意到 MVC 6 的绑定属性不再作为默认值出现在控制器模板中 我知道该属性仍然存在 但我们仍然需要使用它们吗 我听说它们可以用来防止过度发布攻击 他们是否会删除它 因为 MVC 6 可以找到在不使用它们的情况下防止
  • 线程“main”中的异常 java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonParseException

    我正在使用 Twilio 从我的网络应用程序发送 SMS 消息 我几乎已经完成了集成 它正在发送短信 但生成了错误 我不明白为什么 我已经包含了一个 JSON 依赖项json和这个文件link但我仍然收到错误 我还需要包含哪些其他罐子 Ex
  • 使用 qmake 获取日期

    由于我使用今天的日期作为我的应用程序版本 因此我有兴趣自动填充它 目前我正在我的项目文件中执行以下操作 VERSION 15 4 20 但我想让它自动进行 VERSION YEAR MONTH DAY 任何想法 您可以使用QMAKE POS
  • 抛出异常的哪一部分成本很高?

    在 Java 中 当实际上没有错误时 使用 throw catch 作为逻辑的一部分通常是一个坏主意 部分 因为抛出和捕获异常的成本很高 并且在循环中多次执行通常比其他方法慢得多不涉及抛出异常的控制结构 我的问题是 成本是在 throw c