浅谈JVM闪崩问题定位排查

 更新时间:2025年12月08日 11:34:52   作者:猩火燎猿  
JVM闪崩指Java进程异常退出,表现为进程消失、可能生成错误日志或coredump,下面就来介绍一下闪崩问题定位排查,感兴趣的可以了解一下

一、什么是JVM闪崩?

JVM闪崩,指Java进程非正常退出,常见现象为进程消失、没有明显Java异常、可能生成hs_err_pid*.log或core dump,甚至被 操作系统直接kill。

二、排查思路总览

  1. 收集信息:日志、dump文件、系统状态。
  2. 分析JVM日志:重点查看hs_err_pid*.log
  3. 分析系统日志:排查资源耗尽、进程被杀等情况。
  4. 分析core dump:定位native层崩溃。
  5. 回溯应用变更:查找近期变动。
  6. 复现与隔离:测试环境模拟,逐步缩小范围。

三、详细排查步骤

1. 收集关键信息

  • JVM错误日志hs_err_pid*.log(一般在工作目录或/tmp下)
  • GC日志:如有开启,便于分析内存状况
  • 应用日志:stdout、stderr、业务日志
  • 系统日志/var/log/messagesdmesg
  • core dump文件:如有配置,通常在工作目录或指定路径

2. 分析hs_err_pid*.log文件

重点关注以下字段:

字段说明
Error Signal如 SIGSEGV、SIGBUS、SIGFPE、SIGILL,指明崩溃类型
Problematic frame崩溃发生的native库及函数
Java/Native Stack崩溃线程的堆栈,判断与应用代码还是native库有关
Loaded Libraries已加载的native库,排查第三方库
JVM Version/ArgsJVM版本、启动参数,排查已知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
  • SIGSEGV:段错误,通常是内存非法访问
  • libnative.so:第三方native库导致崩溃

3. 分析系统日志

查看是否有OOM Killer记录

grep -i 'kill' /var/log/messages
dmesg | grep -i 'oom'

检查是否有硬件故障、磁盘异常等

查看进程资源限制

ulimit -a 

4. 分析core dump(如有)

使用gdb分析

gdb java core
(gdb) bt

定位native崩溃堆栈

如果涉及第三方native库,联系库厂商或查阅源码

5. 回溯应用变更

  • 是否近期升级JDK、native库、调整JVM参数
  • 是否有新的代码上线,特别是JNI、Unsafe等操作
  • 是否有新部署环境变更(如容器、虚拟化)

6. 复现与隔离

  • 在测试环境重现生产负载,观察是否闪崩
  • 逐步剔除native库、调整JVM参数,找出触发条件
  • 通过压力测试、异常输入等手段复现问题

四、常见JVM闪崩原因

原因排查方法
native库(JNI)异常hs_err_pid*.log显示崩溃在第三方库,隔离/升级该库
系统OOM系统日志有OOM记录,JVM被kill,优化内存参数
JVM自身Bug查阅JVM版本、已知Bug,升级JDK
资源限制(ulimit)文件句柄、线程数超限,调整ulimit
硬件故障系统日志有硬件报错,联系运维排查硬件
容器/虚拟化环境限制容器资源配置不足,调整容器参数

五、典型案例分析

案例1:native库内存越界

  • 问题表现:hs_err_pid*.log显示SIGSEGV,问题帧为第三方库
  • 处理:升级或隔离该库,或联系厂商修复

案例2:系统OOM

  • 问题表现:进程无异常日志,系统日志显示OOM killer kill进程
  • 处理:优化JVM-Xmx参数,提升机器内存或限制其他进程

案例3:JVM版本Bug

  • 问题表现:hs_err_pid*.log显示崩溃在JVM自身代码
  • 处理:查阅JDK发行说明,升级到稳定版本

六、实用排查命令和工具

查找错误日志

find / -name "hs_err_pid*.log" 

查看崩溃信号和问题帧

grep -E 'SIG|Problematic frame' hs_err_pid*.log 

查看ulimit

ulimit -a 

分析core dump

gdb java core 

七、预防与建议

  1. 使用稳定JDK版本,及时升级修复已知Bug
  2. native库充分测试,避免自定义或不成熟库
  3. 合理配置JVM参数,避免资源超限
  4. 开启监控与报警,及时发现异常
  5. 配置core dump和heap dump,便于事后分析
  6. 灰度发布/回滚机制,新版本优先小流量测试

八、快速定位流程图

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信息、系统日志片段,可贴出来,我可以帮你进一步分析定位!

十、深入分析技巧

1.hs_err_pid.log 关键字段详解*

异常信号(例如 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

  • 列出所有已加载的native库,排查是否有未授权或不稳定的库。

JVM参数

  • 例如-Xmx-XX:MaxDirectMemorySize等,判断是否资源配置合理。

2.core dump 深度分析

使用 gdb 查看 native 层堆栈

gdb java core 
(gdb) bt 

如果涉及第三方库,建议联系厂商或查阅源码。

可配合 JVM 的 -XX:OnError 参数,在崩溃时自动执行脚本收集更多信息。

3.分析GC日志

  • 判断是否频繁Full GC,是否有内存泄漏或资源耗尽导致JVM异常退出。
  • 关注OutOfMemoryErrorPromotion failed等异常。

4.操作系统资源分析

  • 查看进程资源限制(ulimit),如文件句柄、线程数。
  • 检查系统负载、内存、swap等,是否有其他进程影响。

十一、团队协作流程建议

  1. 建立故障应急群组:运维、开发、测试、架构师等多方协同。
  2. 故障分级响应:根据影响范围,制定不同等级响应流程。
  3. 标准化信息收集脚本:如自动打包hs_err_pid*.log、core dump、系统日志等。
  4. 定期复盘:每次闪崩后,团队复盘总结,完善预案和文档。

十二、典型问题场景与处理建议

场景1:频繁闪崩但日志无明显异常

  • 可能是JVM参数配置不合理(如直接内存过大)。
  • 建议逐步缩减参数,或开启更多JVM诊断参数(如-XX:+PrintFlagsFinal)。

场景2:升级JDK后出现闪崩

  • 查看JDK发行说明,确认是否有兼容性问题。
  • 回退到原版本对比,或升级到更高版本。

场景3:业务代码近期引入JNI/Unsafe

  • 回溯代码变更,重点审查native相关调用。
  • 通过代码审查、单元测试、压力测试等方式排查。

场景4:容器环境JVM闪崩

  • 容器设置的资源限制(如memory、cpu)过低,导致JVM被kill。
  • 检查容器配置,合理调高资源限制。

十三、常用JVM诊断参数

  • -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层、结合系统资源与应用变更。建议建立标准化排查流程,提升故障响应效率。

  • JVM闪崩排查重在信息收集多层分析,建议建立标准化流程。
  • 重点关注hs_err_pid*.log、系统资源、native库变更、JVM参数、容器/虚拟化环境。
  • 建议团队协作、自动化收集、定期复盘,持续优化故障处理能力。
  • 如遇疑难问题,及时寻求JDK厂商、社区或第三方库支持。

到此这篇关于浅谈JVM闪崩问题定位排查的文章就介绍到这了,更多相关JVM闪崩内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot自动装配原理解析

    SpringBoot自动装配原理解析

    Spring Boot自动装配是指在Spring Boot应用启动时,根据类路径下的jar包依赖、Bean定义、各种配置文件等信息,自动配置Spring应用上下文的Bean,本文给大家详细解析了SpringBoot自动装配原理,需要的朋友可以参考下
    2024-11-11
  • Java double类型比较大小详解

    Java double类型比较大小详解

    这篇文章主要介绍了Java double类型比较大小,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • JVM虚拟机查找类文件的顺序方法

    JVM虚拟机查找类文件的顺序方法

    下面小编就为大家分享一篇JVM虚拟机查找类文件的顺序方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Java多线程 ReentrantReadWriteLock原理及实例详解

    Java多线程 ReentrantReadWriteLock原理及实例详解

    这篇文章主要介绍了Java多线程 ReentrantReadWriteLock原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • java中注解的实现原理详解

    java中注解的实现原理详解

    这篇文章主要介绍了java中注解的实现原理详解,注解也叫元数据,例如我们常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解,需要的朋友可以参考下
    2023-10-10
  • java正则表达式实现提取需要的字符并放入数组【ArrayList数组去重复功能】

    java正则表达式实现提取需要的字符并放入数组【ArrayList数组去重复功能】

    这篇文章主要介绍了java正则表达式实现提取需要的字符并放入数组,即基于正则的ArrayList数组去重复功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2017-01-01
  • Java设计模式之单一职责原则精解

    Java设计模式之单一职责原则精解

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。本篇介绍设计模式七大原则之一的单一职责原则
    2022-02-02
  • SpringBoot如何读取application.properties配置文件

    SpringBoot如何读取application.properties配置文件

    这篇文章主要介绍了SpringBoot如何读取application.properties配置文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 用IntelliJ IDEA看Java类图的方法(图文)

    用IntelliJ IDEA看Java类图的方法(图文)

    这篇文章主要介绍了用IntelliJ IDEA看Java类图的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • SpringCloud使用Feign实现远程调用流程详细介绍

    SpringCloud使用Feign实现远程调用流程详细介绍

    OpenFeign源于Netflix的Feign,是http通信的客户端。屏蔽了网络通信的细节,直接面向接口的方式开发,让开发者感知不到网络通信细节。所有远程调用,都像调用本地方法一样完成
    2023-02-02

最新评论