了解Java在抛出异常时的堆栈展开

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了了解Java在抛出异常时的堆栈展开相关的知识,希望对你有一定的参考价值。

在讨论和使用异常与返回值的一些研究中,以下内容引起了我的注意:

它更便宜并且提供更好的性能来返回值,而抛出异常需要创建一个新对象和堆栈展开。

现在,我读了堆栈展开,根据我的理解,它是在跳回到堆栈上的下一帧之前释放当前堆栈帧上所有已分配资源的突然过程。特别是在Java中,没有资源被释放,而是当前在范围内的所有对象都被取消引用并且符合GC的条件。另一方面,在优雅返回的情况下,由于超出范围,对象立即被销毁。

问题是:

有一个声明了少量实例的方法(例如3)并假设如果抛出异常,它将被捕获到下一级别(例如它不会爬升到5个堆栈级别),是否真的有明显的(不确定这是否是正确使用的词)与返回值相比,性能明智吗?我知道在一天结束的时候,在一个简单的场景中,不会有明显的差异,但它可能导致更大的系统中的一个吗?

请假设在方法中的那一点抛出异常是有意义的(这是一种特殊情况)并且它不适用于控制流(这是一个已知的错误)。仅出于性能原因,返回值将是优选的。

答案

考虑到要创建异常的Stacktrace,java不只是回到直接调用者。 Java一直上升到根堆栈。因此,根据您的小方法的运行深度,创建Stacktrace可能会很昂贵。

还要注意这个问题:Which part of throwing an Exception is expensive?

以上是关于了解Java在抛出异常时的堆栈展开的主要内容,如果未能解决你的问题,请参考以下文章

为啥我应该在抛出异常指针时使用按引用捕获

谁在抛出(并捕获)这个 MySQL 异常?

如何打破 Silverlight 中未处理的异常

SmtpClient.SendMailAsync 在抛出特定异常时导致死锁

为啥内核驱动程序在抛出异常时无法更新注册表值?

XCode 6.3 在抛出 Objective-C++ 异常时立即引发 SIGABRT