-xx:+errorfile用于指定jvm致命错误时生成hs_err_pid.log的位置,是分析native层崩溃的第一手证据;它不触发崩溃,仅设置日志路径,需配合-xx:+unlockdiagnosticvmoptions,且仅对sigsegv等native错误生效。

通过配置 -XX:+ErrorFile,JVM 可以在发生致命错误(如 SIGSEGV、SIGBUS、JVM 内部断言失败等)时,将底层 C++ 层的崩溃现场写入指定路径的 hs_err_pid<pid>.log</pid> 文件。这个日志不依赖 Java 层异常机制,而是由 JVM 的信号处理线程直接捕获,是分析 JVM 本身、HotSpot 运行时、本地库或 GC 崩溃的**第一手证据**。
明确 -XX:+ErrorFile 的作用和限制
该参数本身不“触发”崩溃,而是**指定崩溃日志的保存位置**。它必须配合 -XX:+UnlockDiagnosticVMOptions(某些 JDK 版本需要)使用,且仅在 JVM 遇到无法恢复的 native 层错误时生效。注意:
- 它不影响 Java 层
Exception或Error,那些走的是Throwable.printStackTrace()流程; - 若未设置,JVM 默认在当前工作目录生成
hs_err_pid<pid>.log</pid>,但可能因权限或磁盘满而写入失败; - JDK 8u92+ 默认启用该功能,但路径仍需显式指定才可靠。
正确配置 ErrorFile 路径(含权限与路径规范)
推荐在启动脚本中添加如下 JVM 参数:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-XX:+UnlockDiagnosticVMOptions -XX:ErrorFile=/var/log/jvm/hs_err_pid%p.log
关键细节:
-
%p是必需占位符,会被替换为当前 JVM 进程 PID,避免多实例日志覆盖; - 目标目录(如
/var/log/jvm/)必须存在,且 JVM 启动用户对该目录有 写权限; - 避免使用相对路径或临时目录(如
/tmp),某些容器或 systemd 环境下可能被清理或无权写入; - 可加
-XX:OnError="tail -n 100 /var/log/jvm/hs_err_pid%p.log | mail -s 'JVM Crash' admin@company.com"实现崩溃后自动告警(需确保 shell 命令可用)。
确认日志是否真正生成并可读
光配参数不等于日志一定成功落地。验证步骤:
- 启动 JVM 后检查进程参数:
ps -ef | grep java | grep ErrorFile,确认参数已生效; - 主动触发一次可控崩溃(仅测试环境!):
kill -SEGV <jvm-pid></jvm-pid>,观察目标目录是否生成对应hs_err_pid*.log; - 打开日志,确认开头有
# A fatal error has been detected by the Java Runtime Environment:,并包含siginfo、registers、Native frames、Internal exceptions等原生段落; - 若日志为空或报
Could not create hs_err file,立即检查目录权限、磁盘空间及 SELinux/AppArmor 策略。
结合其他关键参数提升诊断深度
单靠 ErrorFile 不足以定位复杂问题,建议组合以下参数:
-
-XX:+PrintGCDetails -Xloggc:/var/log/jvm/gc.log:排除 GC 导致的 native 崩溃(如 CMS 并发模式失败引发的 assert); -
-XX:NativeMemoryTracking=detail+jcmd <pid> VM.native_memory summary</pid>:排查 native memory 泄露导致的 OOM-Kill 或 mmap 失败; -
-XX:+ShowMessageBoxOnError(开发机适用):崩溃时弹窗,方便 attach gdb 调试; - Linux 下搭配
coredumpctl debug <pid></pid>或提前配置/proc/sys/kernel/core_pattern生成 core dump,与 hs_err 日志互为印证。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










