2011-01-11 91 views
40

在我的应用程序日志中(使用log4j),我看到一个NullPointerException,但没有堆栈跟踪。我知道,作为一种优化,当异常发生很多次时,jvm停止生成堆栈跟踪。问题是前一段时间发生的异常,并且我的所有日​​志都填充了没有堆栈跟踪的异常。有没有办法“重置”这个机制,所以下一个抛出的异常将被打印完整的堆栈跟踪?我不想重新启动应用程序,因为它很难重现此错误,并且重新启动可能会导致“消失”...没有堆栈跟踪的循环异常 - 如何重置?

谢谢!

+1

“我知道,作为一种优化,当异常发生很多次时,jvm停止产生堆栈跟踪”。你知道这个怎么样?这不是真的。 – skaffman 2011-01-11 15:25:11

+0

它可能是因为在catch块中只有异常的原因已被记录 – 2011-01-11 15:25:58

回答

66

尝试用以下JVM属性运行:

-XX:-OmitStackTraceInFastThrow 

Release Notes

在VM现在 提供正确的堆栈回溯的 所有的“冷”服务器编译器内置例外。对于 的性能目的,当这种异常抛出几次时,可能会重新编译 方法。在 重新编译之后,编译器可以使用预分配的 异常来选择更快的策略,该异常不会提供堆栈 跟踪。要完全禁用预分配的例外使用 ,请使用此新标志: -XX:-OmitStackTraceInFastThrow