1. 程式人生 > >java異常資訊沒列印堆疊

java異常資訊沒列印堆疊

程式碼

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,始終丟擲含異常的堆疊