60
votes

In my application log (using log4j), I see a NullPointerException, but without the stack trace. I know that as an optimization, when an exception occurs many times - the jvm stops producing the stack trace. The problem is the exception occurred some time ago, and all my logs are filled with the exception without the stack trace. Is there a way to "reset" this mechanism, so the next thrown exception will be printed with the full stack trace? I don't want to restart the application, as it is hard to reproduce this bug, and restarting may cause to "go away"...

Thanks!

1
"I know that as an optimization, when an exception occurs many times - the jvm stops producing the stack trace". You know this how? It's not true.skaffman
it can be because of in catch block only the cause of the exception has been loggedjmj
Yes it is kind of optimization - see the answer of @dogbane. @Jigar - this is not related to the logging, the exception itself has no stack trace.duduamar
There's a similar question with some more information on the subject on SO. Just posting a link so it can be found from here. stackoverflow.com/q/2411487/1407656toniedzwiedz

1 Answers

94
votes

Try running with the following JVM property:

-XX:-OmitStackTraceInFastThrow

From the Release Notes:

The compiler in the server VM now provides correct stack backtraces for all "cold" built-in exceptions. For performance purposes, when such an exception is thrown a few times, the method may be recompiled. After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace. To disable completely the use of preallocated exceptions, use this new flag: -XX:-OmitStackTraceInFastThrow.