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,始終拋出含異常的堆棧

 

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