抛出Java异常时是否生成堆栈跟踪?
这是假设我们不调用.printstacktrace方法-只是抛出和捕获抛出Java异常时是否生成堆栈跟踪?,java,performance,exception,exception-handling,jvm,Java,Performance,Exception,Exception Handling,Jvm,这是假设我们不调用.printstacktrace方法-只是抛出和捕获 我们正在考虑一些性能瓶颈。不,堆栈跟踪是在构造异常对象时生成的,而不是在抛出异常对象时生成的。Throwable()构造函数调用fillInStackTrace()。(至少在Sun/Oracle的JDK 6 for Windows中是这样。)在构造异常时捕获Stacktrace 如果你真的不关心stacktrace,你可以构造一个异常并多次抛出它,但它看起来像是一个黑客,可能会让人困惑。一个可丢弃的对象捕获当前堆栈(使用本机
我们正在考虑一些性能瓶颈。不,堆栈跟踪是在构造异常对象时生成的,而不是在抛出异常对象时生成的。Throwable()构造函数调用fillInStackTrace()。(至少在Sun/Oracle的JDK 6 for Windows中是这样。)在构造异常时捕获Stacktrace
如果你真的不关心stacktrace,你可以构造一个异常并多次抛出它,但它看起来像是一个黑客,可能会让人困惑。一个可丢弃的对象捕获当前堆栈(使用本机代码),不管它是否会被打印。这就是为什么不应该将异常(ab)用于控制流的原因。在调用printStackTrace()方法时,它不是惰性地构建的 Neal Gafter(构建Java团队的前Sun工程师)提到了异常性能: 例外中最昂贵的部分 到目前为止,处理是捕获堆栈 创建异常时进行跟踪
另请参见。供参考。您可以重载fillInStackTrace以避免性能损失。我们在twitter上这样做的时候,我们需要处理某些不关心堆栈跟踪的异常 PlayFramework在Play1.3.x行中也实现了这一点
此外,您可以中断fillInStackTrace以查看它是否在构造时完成。此外,如果您关心性能,您可以覆盖
fillInStackTrace()
以不执行任何操作。引发异常和构造异常之间有区别。Andy,您完全正确。我没有足够仔细地阅读这个问题。如果你想要表现,你真的不应该抛出异常,这应该只适用于不会影响你表现的异常情况。也许你可以在没有异常的情况下做你想做的事情?异常代价很大,因为每次抛出异常时,都必须创建并填充堆栈跟踪。想象一下,由于资金不足,余额转账操作在1%的情况下失败。即使故障率相对较低,性能也可能受到严重影响。请参见此处的源代码和基准测试结果: