生產環境拋異常,但卻沒有將完整的堆疊資訊輸出到日誌,可以確定的是日誌輸出時用的是log.error(「message」, e),測試環境和本地環境都正常,起初以為是因為微服務分布式部署,logstash在同步日誌的時候,按行提哦送,不同worker的日誌有穿插,後來就每次發生異常的時候把異常日誌蒐集到一行,發現還是丟失了root caused by,後來經過搜尋發現,與jdk5的乙個新特性有關:
對於一些頻繁丟擲的異常,jdk為了效能會做乙個優化,即jit重新編譯後會丟擲沒有堆疊的異常而在使用-server模式時,該優化選項是開啟的,因此在頻繁丟擲某個異常一段時間後,該優化開始起作用,即只丟擲沒有堆疊的異常資訊本地測試時,npe連續丟擲5000+次就會丟失異常棧
解決方案:在啟動命令中加上 -xx:-omitstacktraceinfastthrow ,禁用這一優化
目前會被優化的異常有:
空指標異常記錄
空指標異常是指 當應用程式試圖在需要物件的地方使用 null 時,丟擲該異常。也就是你沒有建立這個物件,你卻呼叫他,或者呼叫他的方法,或者訪問 修改他的屬性,這時會丟擲乙個空指標異常。我這兩天遇到的問題是,我傳入乙個為null的屬性,或者沒有傳入必要屬性,就會在return的地方報乙個空指標異常。注...
Android context空指標異常
fragment中的 context 是null public class placeholderfragment extends fragment 這樣定義的context是null。當然咯,我實際 不是這樣寫的,可是這個意思。假設是在activity中就不會是空。在fragment中就是null...
getActionBar 報空指標異常
1.載入完檢視後,再去獲取 寫在setcontentview 後面。2.sdk版本 actionbar的主題在3.0以後才有,使用的時候要確保,最低的版本不能小於3.0。html view plain copy print?uses sdk android minsdkversion 11 andr...