java異常資訊沒列印堆疊
阿新 • • 發佈:2018-12-15
程式碼
try{
doSomething();
}catch(Exception e){
logger.error(e.getMessage(),e);
}
這段程式碼在本地和測試站除錯的時候如果出現錯誤,會列印正常的堆疊資訊,如:
java.lang.NullPointerException: null at com.test.service.Test.test(Test.java:234) at com.test.service.Test.test2(Test.java:149) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
但在正式站中出現問題只發現java.lang.NullPointerException: null這一行
導致排查問題比較困難,發現它跟JDK5的一個新特性有關,對於一些頻繁丟擲的異常,JDK為了效能會做一個優化,即JIT重新編譯後會丟擲沒有堆疊的異常,而在使用-server模式時,該優化選項是開啟的,因此在頻繁丟擲某個異常一段時間後,該優化開始起作用,即只丟擲沒有堆疊的異常資訊,而本地和測試站因為訪問量小,丟擲這種異常數量有限,所以並沒有優化
解決方案:jvm啟動引數增加 -XX:-OmitStackTraceInFastThrow,始終丟擲含異常的堆疊