抛出异常的哪一部分是昂贵的?

抛出异常的哪一部分是昂贵的?,第1张

抛出异常的哪一部分是昂贵的?

创建
异常对象并不比创建其他常规对象贵。主要成本隐藏在本机

fillInStackTrace
方法中,本机方法遍历调用堆栈并收集所有必需的信息以构建堆栈跟踪:类,方法名称,行号等。

有关高异常成本的神话来自大多数

Throwable
构造函数都隐式调用的事实
fillInStackTrace
。但是,有一个构造函数可以创建
Throwable
没有堆栈跟踪的。它使您可以快速实例化可抛出对象。创建轻量级异常的另一种方法是重写
fillInStackTrace


现在 抛出 异常怎么办?
实际上,这取决于在哪里 捕获 引发的异常。

如果使用相同的方法(或更确切地说,在相同的上下文中,因为上下文可以由于内联而包含多种方法)捕获它,则

throw
它的速度和简便性
goto
(当然,在JIT编译之后)也是如此。

但是,如果某个

catch
块位于堆栈的更深处,那么JVM需要展开堆栈帧,这可能需要更长的时间。如果
synchronized
涉及到块或方法,则花费的时间甚至更长,因为展开意味着释放已删除堆栈帧所拥有的监视器。


我可以通过适当的基准确认以上陈述,但是幸运的是,我不需要这样做,因为HotSpot的性能工程师Alexey
Shipilev的帖子已经很好地涵盖了所有方面:Lil’Exception
的出色性能。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5478673.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存