67

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!

4
  • 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. Commented Jan 11, 2011 at 15:25
  • it can be because of in catch block only the cause of the exception has been logged Commented Jan 11, 2011 at 15:25
  • 5
    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. Commented Jan 11, 2011 at 15:34
  • 1
    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/1407656 Commented Jul 16, 2014 at 12:32

1 Answer 1

106

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.

Sign up to request clarification or add additional context in comments.

4 Comments

Thanks, that sounds good. Is it possible to enable this flag on the fly for a running java process?
@duduamar I don't know for certain, but my guess is that you can't.
@duduamar: There is now an open ticket for changing this flag at runtime - JDK-8046503 - Ability to reset OmitStackTraceInFastThrow counter. Still open though.
Last comment from JDK-8046503 is discouraging: "Turning off OmitStackTraceInFastThrow at runtime is not enough. The affected methods would also need to be recompiled and StackTraceInThrowable needs to be enabled as well. This is a Will-Not-Fix candidate."

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.