news 2026/9/4 8:19:38

Java 故障排查:GC 日志、线程堆栈、内存快照 dump 全套命令

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 故障排查:GC 日志、线程堆栈、内存快照 dump 全套命令

环境准备与基础信息

环境要求:Linux 系统,JDK8 或 JDK11+。

第一步:获取 Java 进程 PID

# 方法一:使用 jps jps -l 方法二:使用 ps ps -ef | grep java

假设获取到的进程 PID 为 12345,下文所有命令中的 PID 请替换为你的实际进程 ID。

一、线程堆栈 ThreadDump(现场抓取,建议多次抓取对比)

ThreadDump 用于排查死锁、线程阻塞、CPU 飙高等问题。

方式 1:jstack(最常用)

# 输出线程栈到文件 jstack 12345 > thread_dump_12345_$(date +%Y%m%d_%H%M).txt 连续抓取 3 次,间隔 2 秒(便于观察线程状态变化) jstack 12345 > thread1.txt sleep 2 jstack 12345 > thread2.txt sleep 2 jstack 12345 > thread3.txt 强制模式(当进程无响应时使用) jstack -F 12345 > thread_dump_force.txt

方式 2:kill -3(不杀死进程,仅输出线程栈)

kill -3 12345

⚠️ 注意:这是kill -3,不是kill -9kill -3只是向进程发送信号,用于打印线程栈到标准输出(通常为 catalina.out 或应用日志)。

二、内存快照 HeapDump(.hprof 文件,排查 OOM、内存泄漏)

1. jmap 手动触发 dump(进程存活时抓取)

# 完整堆 dump,live=true 只 dump 存活对象(推荐,过滤死亡对象,文件更小) jmap -dump:live,format=b,file=heap_12345_$(date +%Y%m%d_%H%M).hprof 12345

参数说明:

  • live:执行 FullGC,只保存存活对象,文件更小;去掉 live 会 dump 全部对象(包括垃圾对象)。
  • format=b:二进制 hprof 格式,MAT 等工具可识别。
# 强制模式(当进程无响应时使用) jmap -dump:live,format=b,file=heap_force.hprof -F 12345

2. OOM 自动 dump(需事前配置,故障发生后无法临时添加)

在 JVM 启动参数中添加以下配置,发生 OOM 时自动生成 hprof 文件:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/heapdump.hprof

两种 OOM 情况:

  1. JVM 内部 OOM:Java 抛出java.lang.OutOfMemoryError,进程可能退出,也可能僵死不退出(假死,不响应请求,CPU 使用率低)。
  2. 系统层 OOM Killer:整机物理内存耗尽,操作系统直接杀死 Java 进程,dmesg中可见 OOM-kill 记录。

业务恢复手段:

  • 进程僵死(进程存在但接口无响应、页面卡死):先抓现场,再重启进程,切勿直接 kill。
  • 进程已被系统 OOM Killer 杀死:直接启动应用,恢复业务。
  • 多实例部署:若集群有多台机器,可先下线故障节点,由其他机器承接流量,保证业务可用性,再排查故障机器。

三、GC 日志(重点:GC 日志不能事后抓取!必须 JVM 启动时预先开启)

JDK8 GC 日志启动参数

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/data/logs/gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M

JDK11+ 使用统一 Xlog(新 API)

-Xlog:gc*:file=/data/logs/gc-%t.log:time,uptimemillis:filecount=10,filesize=100M

故障现场实时查看 GC 状态(jstat,实时采样)

# 每 1000ms 输出一次,共输出 20 次 jstat -gc 12345 1000 20

重点监控指标:YGC(Young GC 次数)、YGCT(Young GC 时间)、FGC(Full GC 次数)、FGCT(Full GC 时间)、GCT(总 GC 时间)。关注 FullGC 次数和总停顿时间。

查看 GC 日志:

  • 若 JVM 启动参数已配置 GC 日志,直接查看日志文件,关注频繁 FullGC、OOM 异常;
  • 若未开启历史 GC 日志,可现场实时采样 GC 状态:
jstat -gc PID 1000 30 > jstat_gc.log

查看应用 stdout/catalina.out 日志:

# 搜索 OOM 异常堆栈 grep -n "OutOfMemoryError" app.log

若进程已被杀死、不复存在:无法通过jstack/jmap抓取 dump,只能依赖历史监控、GC 日志、应用日志进行复盘。

四、故障现场完整操作脚本(可直接复制执行)

PID=12345 DATE=$(date +%Y%m%d_%H%M%S) 1. 连续 3 次线程 dump jstack $PID > thread_dump_${DATE}1.txt sleep 2 jstack $PID > thread_dump${DATE}2.txt sleep 2 jstack $PID > thread_dump${DATE}_3.txt 2. 堆内存快照(注意:大堆 dump 会卡顿业务!确保磁盘空间充足) jmap -dump:live,format=b,file=heapdump_${DATE}.hprof $PID 3. 实时 GC 采样 jstat -gc $PID 1000 10 > jstat_gc_${DATE}.log

五、工具总结清单

内容命令输出文件用途备注
线程堆栈jstack PID > xxx.txt.txt死锁、CPU 高、线程阻塞抓 3 次对比;卡死用 -F
堆内存快照jmap -dump:live,format=b,file=xxx.hprof PID.hprof内存泄漏、OOM 分析大堆会 STW,占磁盘 IO
GC 历史日志JVM 启动参数 -Xloggcgc-xxx.logGC 停顿、频繁 FullGC必须提前开启,事后无法抓取
实时 GC 状态jstat -gc PID 1000 20控制台输出现场看当前 GC 情况快照采样,不是历史日志
线程栈备选kill -3 PID输出到应用 stdout/catalina.out线程栈不会杀死进程

六、常见注意事项

  • jmap dump 大堆(>8G)会造成业务卡顿,尽量在业务低峰期执行;故障迫不得已时才执行。
  • GC 日志必须 JVM 启动时配置,进程已经挂了就拿不到 GC 历史。
  • hprof 文件需要 MAT 工具解析,不要直接使用 vim 打开。
  • 执行 jstack/jmap 需要和 Java 进程同用户,root 用户有时会因权限问题导致异常。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 8:52:43

场景浸入式英语学习:从机场到日常沟通的工程化实践

那天在机场候机,我盯着登机口屏幕上滚动的英文通知,突然意识到一个长久以来被自己忽略的“能力断层”。我能熟练地敲代码、看技术文档,甚至能快速理解一篇复杂的英文论文,但当广播里传来“We are now boarding passengers in Grou…

作者头像 李华
网站建设 2026/9/4 20:51:08

2026年7月日照市新房价格深度分析报告

一、报告背景与数据说明本报告基于2026年7月日照市新房实际成交案例,结合区域分布、楼盘定位、户型结构与成交价格等维度,对当前日照市新房市场进行深度分析。数据来源为2026年7月日照市各主要城区新房网签备案及典型楼盘实际成交记录,覆盖东…

作者头像 李华
网站建设 2026/9/4 15:23:26

游戏推理任务设计:基于状态机与对话树构建剧情解谜系统

这次我们来看一个游戏推理任务的设计与实现思路。标题提到的《食盒疑案》第六幕,是一个典型的剧情驱动型解谜玩法,核心是“传唤证人-梳理证词-找出关键道具(食盒)”。对于游戏开发者、剧情策划,或是想学习如何设计分支…

作者头像 李华
网站建设 2026/9/4 9:12:32

小数据集目标检测实战:从282张公路落石图像到工业级模型部署

简介:本资源是一份面向计算机视觉初学者与目标检测实践者的公路落石检测专用数据集,适用于YOLO系列与Pascal VOC框架下的模型训练与算法验证,特别适合交通场景异常物体识别的入门级项目实践。数据包共1019个文件,包含282张JPG实景…

作者头像 李华
网站建设 2026/9/4 9:15:50

CP2102驱动安装全攻略:从XP到Win11的兼容性与故障排查

简介:面向使用CP2102芯片USB转UART桥接的开发板、模块及微控制器用户,这份驱动资源解决了在WinXP、Win7、Vista系统下,32位与64位环境中的设备识别与通信问题。包内含13个文件,涵盖sys内核驱动、exe安装程序、dll动态库、cat数字签…

作者头像 李华