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