9人参与 • 2025-12-08 • Java
jvm闪崩,指java进程非正常退出,常见现象为进程消失、没有明显java异常、可能生成hs_err_pid*.log或core dump,甚至被 操作系统直接kill。
hs_err_pid*.log。hs_err_pid*.log(一般在工作目录或/tmp下)/var/log/messages、dmesg重点关注以下字段:
| 字段 | 说明 |
|---|---|
| error signal | 如 sigsegv、sigbus、sigfpe、sigill,指明崩溃类型 |
| problematic frame | 崩溃发生的native库及函数 |
| java/native stack | 崩溃线程的堆栈,判断与应用代码还是native库有关 |
| loaded libraries | 已加载的native库,排查第三方库 |
| jvm version/args | jvm版本、启动参数,排查已知bug |
| system info | 操作系统、cpu架构信息 |
举例:
# a fatal error has been detected by the java runtime environment: # # sigsegv (0xb) at pc=0x00007f8c3b6e1c04, pid=12345, tid=12346 # problematic frame: # c [libnative.so+0x1c04] crash_func+0x14
查看是否有oom killer记录
grep -i 'kill' /var/log/messages dmesg | grep -i 'oom'
检查是否有硬件故障、磁盘异常等
查看进程资源限制
ulimit -a
使用gdb分析
gdb java core (gdb) bt
定位native崩溃堆栈
如果涉及第三方native库,联系库厂商或查阅源码
| 原因 | 排查方法 |
|---|---|
| native库(jni)异常 | hs_err_pid*.log显示崩溃在第三方库,隔离/升级该库 |
| 系统oom | 系统日志有oom记录,jvm被kill,优化内存参数 |
| jvm自身bug | 查阅jvm版本、已知bug,升级jdk |
| 资源限制(ulimit) | 文件句柄、线程数超限,调整ulimit |
| 硬件故障 | 系统日志有硬件报错,联系运维排查硬件 |
| 容器/虚拟化环境限制 | 容器资源配置不足,调整容器参数 |
hs_err_pid*.log显示sigsegv,问题帧为第三方库hs_err_pid*.log显示崩溃在jvm自身代码查找错误日志
find / -name "hs_err_pid*.log"
查看崩溃信号和问题帧
grep -e 'sig|problematic frame' hs_err_pid*.log
查看ulimit
ulimit -a
分析core dump
gdb java core
flowchart td
a[jvm闪崩] --> b{是否有hs_err_pid*.log}
b -- 有 --> c[分析日志]
b -- 无 --> d[查系统日志]
c --> e{native库/系统资源/jvm自身}
d --> e
e --> f[定位原因]
f --> g[修复/优化/升级]
如有具体hs_err_pid*.log内容、core dump信息、系统日志片段,可贴出来,我可以帮你进一步分析定位!
异常信号(例如 sigsegv)
sigsegv:段错误,通常是非法内存访问。sigbus:总线错误,可能是硬件或内存映射问题。sigfpe:浮点运算异常,如除零。sigill:非法指令,通常是jvm或native库损坏。problematic frame
直接定位到崩溃的native方法或库。例如:
problematic frame: c [libnative.so+0x1c04] crash_func+0x14
如果是 jvm 自身的代码(如 hotspot),建议查阅对应版本的已知bug。
线程堆栈(thread stack)
loaded libraries
jvm参数
-xmx、-xx:maxdirectmemorysize等,判断是否资源配置合理。使用 gdb 查看 native 层堆栈
gdb java core (gdb) bt
如果涉及第三方库,建议联系厂商或查阅源码。
可配合 jvm 的 -xx:onerror 参数,在崩溃时自动执行脚本收集更多信息。
outofmemoryerror、promotion failed等异常。hs_err_pid*.log、core dump、系统日志等。-xx:+printflagsfinal)。-xx:+heapdumponoutofmemoryerror:oom时自动生成heap dump。-xx:+printgcdetails -xloggc:<file>:输出详细gc日志。-xx:+usegclogfilerotation -xx:numberofgclogfiles=10 -xx:gclogfilesize=20m:gc日志滚动。-xx:onerror="sh collect_info.sh":崩溃时自动执行收集脚本。#!/bin/bash
# collect_info.sh
date > info.txt
echo "==== hs_err_pid logs ====" >> info.txt
find / -name "hs_err_pid*.log" -exec cat {} \; >> info.txt
echo "==== dmesg ====" >> info.txt
dmesg | tail -n 100 >> info.txt
echo "==== ulimit ====" >> info.txt
ulimit -a >> info.txt
echo "==== top ====" >> info.txt
top -b -n 1 >> info.txt
tar czf jvm_crash_info_$(date +%s).tar.gz info.txt将此脚本配置到jvm参数-xx:onerror="sh /path/collect_info.sh",崩溃时自动收集关键信息。
jvm闪崩排查需要多维度分析,重在收集关键信息、分析日志、定位native层、结合系统资源与应用变更。建议建立标准化排查流程,提升故障响应效率。
hs_err_pid*.log、系统资源、native库变更、jvm参数、容器/虚拟化环境。到此这篇关于浅谈jvm闪崩问题定位排查的文章就介绍到这了,更多相关jvm闪崩内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论