목차

Oracle(SUN) JVM Options

-XX:-OmitStackTraceInFastThrow

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.
built-in 예외가 반복적으로 발생할 경우 메소드를 다시 컴파일 하여 성능을 높일 수 있다. 재컴파일 이후, 컴파일러는 미리 할당된 예외를 던지는데, 이 예외에는 stack trace가 없다.

원천적이로 이 기능을 끄려면 -XX:-OmitStackTraceInFastThrow 옵션을 사용한다. 하지만 굳이 이 옵션을 사용할 필요가 없다.

이 경우, 동일 JVM에서 비슷하게 발생한 다른 에러 로그를 찾아보면 과거에 발생했던 에러 로그에서 stacktrace를 찾을 수 있다. 혹은 JVM을 다시 실행해서 재현해봐도 전체 stacktrace를 얻을 수 있다.

재현해보기

public class NpeThief {
  public void callManyNPEInLoop() {
    for (int i = 0; i < 1000000; i++) {
      try {
        ((Object)null).getClass();
      } catch (Exception e) {
        // stacktrace길이가 2 이다가 어느 순간 0으로 바뀐다.
        System.out.println(e.getStackTrace().length);
      }
    }
  }
  public static void main(String ... args) {
    NpeThief thief = new NpeThief();
    thief.callManyNPEInLoop();
  }
}

-XX:+AlwaysPreTouch

참조