現象
ider更新代碼使用jrebel熱部署代碼。tomcat崩潰,並報以下錯誤:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000075744686, pid=18436, tid=9956
#
# JRE version: Java(TM) SE Runtime Environment (8.0_31-b13) (build 1.8.0_31-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.31-b07 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# V [jvm.dll+0x4c4686]
#
# Core dump written. Default location: C:\java\tomcat\apache-tomcat-8.5.34-windows-x64\apache-tomcat-8.5.34\bin\hs_err_pid18436.mdmp
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
#
具體在tomcat生成三個文件中hs_err_pid18436.log可以查看詳情
分析
-
EXCEPTION_ACCESS_VIOLATION表示jvm crash時正在執行jvm自身的代碼,這往往是因爲jvm的bug導致的crash。
-
出現crash時jvm正在執行的代碼。V代表 VMframe
# Problematic frame: # V [jvm.dll+0x4c4686]
-
導致crash的線程信息。線程類型是JavaThread,JavaThread表示執行的是java線程。線程名爲C2 CompilerThread2
Current thread (0x000000002118e000): JavaThread "C2 CompilerThread2" daemon [_thread_in_native, id=9956, stack(0x0000000022aa0000,0x0000000022ba0000)]
由上面三個信息猜想是jvm自身的bug。到Java Bug Database查詢是否有相關記錄。查詢關鍵字爲
V [jvm.dll+0x4c4686]
找到bug id爲8169194。https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8169194 。裏面的錯誤信息跟我比較相似
。所以暫時斷定發生的錯誤跟其一致。而底下的回覆說這個bug是jdk本身的bug,並且在8u112版本已經修復了。
解決方法
升級jdk版本1.8.0_31到1.8.0_231。因爲本人對jvm不甚瞭解,這個只是我暫時用於解決問題。後續再觀察一段時間看看,如果不再出現這個問題的話。那就說明我的猜想成功,就是jdk自身的問題。
另外生成mdmp文件。
是因爲我在ider添加vm參數:-XX:+CreateMinidumpOnCrash