JVM致命錯誤日志(hs_err_pid.log)分析


JVM致命錯誤日志(hs_err_pid.log)分析

jvm出現致命錯誤時,會生成一個錯誤文件 hs_err_pid<pid>.log,其中包括了導致jvm crash的重要信息,可以通過分析該文件定位到導致crash的根源,從而改善以保證系統穩定。當出現crash時,該文件默認會生成到工作目錄下.

背景

並發線程處理PDF文件,jvm出現致命錯誤時,生成錯誤文件 hs_err_pid.log。

SIGBUS意味着指針所對應的地址是有效地址,但總線不能正常使用該指針。通常是未對齊的數據訪問所致。

查看hs_err_pid.log日志

這里一個重要信息是SIGBUS(0x7)表示jvm crash時正在執行線程試圖訪問一塊無文件內容對應的內存區域,比如超過文件尾的內存區域,或者以前有文件內容對應,現在為另一進程截斷過的內存區域。其中SISBUS是信號名稱,0x7是信號碼,pc=0x00007fa4495592a0指的是程序計數器的值,pid=34372是進程號,tid=0x00007fa320cd2700是線程號。

文件下面是導致crash的線程信息和該線程棧信息,描述信息如下:

Current thread (0x00007fa348028000):  JavaThread "hlooc-task-Orders-9" daemon [_thread_in_vm, id=37394, stack(0x00007fa320bd2000,0x00007fa320cd3000)]

siginfo: si_signo: 7 (SIGBUS), si_code: 2 (BUS_ADRERR), si_addr: 0x00007fa449e29041

以上表示導致出錯的線程是0x00007fa348028000(指針),線程類型是JavaThreadJavaThread表示執行的是java線程,關於該線程其它類型還可能是:

  • VMThread:jvm的內部線程
  • CompilerThread:用來調用JITing,實時編譯裝卸class 。 通常jvm會啟動多個線程來處理這部分工作,線程名稱后面的數字也會累加,例如:CompilerThread1
  • GCTaskThread:執行gc的線程
  • WatcherThreadjvm周期性任務調度的線程,是一個單例對象。 該線程在JVM內使用得比較頻繁,比如:定期的內存監控、JVM運行狀況監控,還有我們經常需要去執行一些jstat 這類命令查看gc的情況
  • ConcurrentMarkSweepThreadjvm在進行CMS GC的時候,會創建一個該線程去進行GC,該線程被創建的同時會創建一個SurrogateLockerThread(簡稱SLT)線程並且啟動它,SLT啟動之后,處於等待階段。CMST開始GC時,會發一個消息給SLT讓它去獲取JavaReference對象的全局鎖:Lock

后面的hlooc-task-Orders-9表示線程名,daemon表示該線程為守護線程,再后面的[_thread_in_vm表示線程正在執行虛擬機代碼,關於該描述其它類型還可能是:

  • _thread_in_native:線程當前狀態
  • _thread_uninitialized:線程還沒有創建,它只在內存原因崩潰的時候才出現
  • _thread_new:線程已經被創建,但是還沒有啟動
  • _thread_in_native:線程正在執行本地代碼,一般這種情況很可能是本地代碼有問題
  • _thread_in_vm:線程正在執行虛擬機代碼
  • _thread_in_Java:線程正在執行解釋或者編譯后的Java代碼
  • _thread_blocked:線程處於阻塞狀態
  • …_trans:以_trans結尾,線程正處於要切換到其它狀態的中間狀態

最后的id=37394表示線程IDstack(0x00007fa320bd2000,0x00007fa320cd3000)表示棧區間。

siginfo: si_signo: 7 (SIGBUS), si_code: 2 (BUS_ADRERR), si_addr: 0x00007fa449e29041這部分是導致虛擬機終止的非預期的信號信息:其中si_signosi_codeLinux下用來鑒別異常的

日志頭文件包含概要信息,簡述了導致crash的原因。而導致crash的原因很多,常見的原因有jvm自身的bug,應用程序錯誤,jvm參數配置不當,服務器資源不足,jni調用錯誤,線程試圖訪問一塊無文件內容對應的內存區域,比如超過文件尾的內存區域,或者以前有文件內容對應,現在為另一進程截斷過的內存區域。

查看liunx系統日志messages

crash發生於11:26:33

查看java業務日志busi.log

11:26:33處理了兩次同一個PDF文件

結論:線程JavaThread "upp-task-Orders-9"試圖訪問的PDF文件無文件內容對應的內存區域,並發處理有問題.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM