Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
抛出Java异常时是否生成堆栈跟踪?_Java_Performance_Exception_Exception Handling_Jvm - Fatal编程技术网

抛出Java异常时是否生成堆栈跟踪?

抛出Java异常时是否生成堆栈跟踪?,java,performance,exception,exception-handling,jvm,Java,Performance,Exception,Exception Handling,Jvm,这是假设我们不调用.printstacktrace方法-只是抛出和捕获 我们正在考虑一些性能瓶颈。不,堆栈跟踪是在构造异常对象时生成的,而不是在抛出异常对象时生成的。Throwable()构造函数调用fillInStackTrace()。(至少在Sun/Oracle的JDK 6 for Windows中是这样。)在构造异常时捕获Stacktrace 如果你真的不关心stacktrace,你可以构造一个异常并多次抛出它,但它看起来像是一个黑客,可能会让人困惑。一个可丢弃的对象捕获当前堆栈(使用本机

这是假设我们不调用.printstacktrace方法-只是抛出和捕获


我们正在考虑一些性能瓶颈。

不,堆栈跟踪是在构造异常对象时生成的,而不是在抛出异常对象时生成的。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%的情况下失败。即使故障率相对较低,性能也可能受到严重影响。请参见此处的源代码和基准测试结果: