JVM運行過程中有可能異常退出,即JVM進程忽然消失,此時通常不是Java Stack或者Java Heap出現異常,而是與OS本地堆棧有關。JVM中運行的應用系統通常難以處理此問題,但如果應用系統中使用了JNI,則有可能與此部分代碼相關。
在Windows上,JVM異常退出時通常會生成“hs_err_pidXXXX.log”文件,此文件位於JVM進程的“當前路徑”下(如Tomcat的bin/),可以從此文件中得到異常退出時的現象。遺憾的是,應用系統開發人員很難分析此文件,但可以根據此文件得到一些信息,或者將此文件反饋給能夠分析的技術社區。
下面列舉幾種HotSpot JVM異常退出時產生的“hs_err_pidXXXX.log”文件中的信息:
異常一:
# An unexpected error has been detected by Java Runtime Environment:
# EXCEPTION_STACK_OVERFLOW (0xc00000fd) at pc=0x6da3a7fd, pid=3012, tid=3108
# Java VM: Java HotSpot(TM) Client VM (11.0-b15 mixed mode windows-x86)
# Problematic frame:
# V [jvm.dll+0x18a7fd]
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp#
異常二:
# An unexpected error has been detected by Java Runtime Environment:
# java.lang.OutOfMemoryError: requested 1024000 bytes for GrET in C:\BUILD_AREA\jdk6_10\hotspot\src\share\vm\utilities\growableArray.cpp. Out of swap space?
# Internal Error (allocation.inline.hpp:42), pid=4060, tid=3816
# Error: GrET in C:\BUILD_AREA\jdk6_10\hotspot\src\share\vm\utilities\growableArray.cpp
# Java VM: Java HotSpot(TM) Client VM (11.0-b15 mixed mode windows-x86)
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
注:上面列舉的JVM異常只包含部分總結性的信息,log文件中還有更多的詳細信息。
HotSpot JVM之外的其他JVM是否有類似信息尚未確定,但此類問題通常應用層開發者難以解決(JNI相關應用的開發者除外)。