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

时间:2010-11-16 14:33:05

标签: java performance exception exception-handling jvm

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

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

5 个答案:

答案 0 :(得分:13)

不,在构造异常对象时生成堆栈跟踪,而不是在抛出异常对象时生成堆栈跟踪。 Throwable()构造函数调用fillInStackTrace()。 (至少在Sun / Oracle的JDK 6 for Windows中。)

答案 1 :(得分:7)

构造异常时捕获Stacktrace。

如果你真的不关心堆栈跟踪,你可以构造一次异常并多次抛出它,但它看起来像是一个黑客,可能会让人感到困惑。

答案 2 :(得分:4)

如果要打印,Throwable对象会捕获当前堆栈(使用本机代码)。这就是为什么异常不应该(ab)用于控制流程的原因。

答案 3 :(得分:2)

当调用printStackTrace()方法

时,它不会延迟构建

Neal Gafter(构建Java的团队的前Sun工程师)提到异常性能here

  

异常中最昂贵的部分   处理到目前为止正在捕获堆栈   创建异常时跟踪

另请参阅this question

答案 4 :(得分:0)

仅供参考。您可以重载fillInStackTrace以避免性能下降。当我们想要某些我们不关心堆栈跟踪的异常时,我们在twitter上执行此操作。

play框架也在play 1.3.x行中执行此操作。

此外,您可以断点fillInStackTrace来查看它是否在构造中完成。