没有堆栈跟踪的重复异常 - 如何重置?

dud*_*mar 50 java exception

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

谢谢!

dog*_*ane 76

尝试使用以下JVM属性运行:

-XX:-OmitStackTraceInFastThrow
Run Code Online (Sandbox Code Playgroud)

发行说明:

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

  • 谢谢,听起来不错.对于正在运行的java进程,是否可以动态启用此标志? (3认同)
  • 来自 JDK-8046503 的最后一条评论令人沮丧:“在运行时关闭 OmitStackTraceInFastThrow 是不够的。受影响的方法还需要重新编译,并且还需要启用 StackTraceInThrowable。这是一个 Will-Not-Fix 候选者。” (2认同)