czwartek, 6 czerwca 2013

Gubienie StackTrace w HotSpot JVM -server

Jeśli JVM jest uruchomione z parametrem -server, to dla często występujących wyjątków mogą zostać obcięte StackTrace'y, np.:
public class NPEnoSTMain {

    public static void main(String[] args) {
        for (int i = 0; i < 100000; i++) {
            try {
                ((Object) null).hashCode();
            } catch (NullPointerException e) {
                e.printStackTrace();
            }
        }
    }

}
Na początku będzie wyświetlał:
java.lang.NullPointerException
 at poligon.NPEnoSTMain.main(NPEnoSTMain.java:8)
a po pewnym czasie już tylko:
java.lang.NullPointerException
Dzieje się tak, gdyż JIT po wykryciu często rzucanego wyjątku zamieni go na preallocated (zcache'owany?) wyjątek - podczas tego procesu jest tracona informacja o StackTrace. Aby temu zapobiec, należy przekazać do JVM parametr:
-XX:-OmitStackTraceInFastThrow
źródło