崩溃或致命错误导致进程异常终止。有各种可能的理由导致崩溃。例如,崩溃可能是由于HotSpot VM、系统库、Java SE 库或API、程序本地代码、甚至操作系统里的 bug。极端因素如操作系统资源耗尽也可以导致崩溃。
因 HotSpot VM 或 Java SE库代码导致的崩溃是罕见的。本章提供如何检查崩溃的建议。有时候可以变通崩溃直到导致崩溃的源被诊断和修复(也就是可以避开崩溃)。
通常,崩溃的第一步是定位致命错误日志。这是HotSpot VM生成的文本文件。附录C-致命错误日志 解释了如何定位文件和文件的详细描述。
4.1 崩溃样本
本节展示一些样本来说明错误日志是如何用于启发崩溃原因的。
4.1 测定哪里发生崩溃
错误日志头显示了有问题的帧。见 C.3 格式头。
如果顶层帧是本地帧且不是操作系统本地帧,这表明问题可能发生在本地库,而不是在JVM里。解决崩溃的第一步是研究本地库发生崩溃的源。有三个选择,取决于本地库的源。
如果本地库是由你的程序提供,研究你的本地库的源代码。选项 -Xcheck:jni
可以帮助查找本地 bug。见 B.2.1 -Xcheck:jni
选项。
如果你的程序使用的本地库是由其他供应商提供,报告bug,提供致命错误日志信息。