【問題經驗】NullPointerException異常堆棧不打印

       最近在項目中遇到一個現象,系統拋出NullPointerException。正常情況,這種問題非常好定位,根據調用棧看看是哪一行空指針就好。 不過這次比較詭異,跑異常的地方沒有打出堆棧。 "java.lang.NullPointerException: null" 這是唯一的信息。

        因爲這是個netty項目,一開始以爲是用了“io.netty.util.internal.ThrowableUtil.unknownStackTrace” 這個方法來創建異常,這個方法會把stack信息抹掉。項目中搜索相關代碼,沒有搜索到用這個方法創建的NullPointerException。

public static <T extends Throwable> T unknownStackTrace(T cause, Class<?> clazz, String method) {
        cause.setStackTrace(new StackTraceElement[] { new StackTraceElement(clazz.getName(), method, null, -1)});
        return cause;
    }

        同事google發現jvm有這方面的優化,稱爲fast throw。當一個異常重複拋出達到一定次數時,jvm就會拋出預先創建好的異常對象。這樣做的好處主要就是不用收集調用棧,也不用申請內存。當然給用戶就帶來困惑,給問題定位帶來一定的麻煩。jvm也給我們提供了配置去關閉這個特性: -XX:-OmitStackTraceInFastThrow

          最後,一般情況不要關閉這個特性。如果遇到了不打棧的情況再考慮加上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章