脚本通过jstat实时采集JVM GC快照判断健康状态:检查FGCT是否增长、OGU/OGC≥85%预警老年代高水位、GCT接近1000ms提示STW过长,集成部署流程并设超时与日志留存。

明确拨测目标:GC关键指标采集
生产环境Java应用启动后,需快速确认JVM GC是否健康运行。核心关注点不是“是否发生GC”,而是:是否频繁Full GC、老年代使用率是否持续高位、GC停顿时间是否超阈值。Shell脚本不直接解析GC日志,而是通过jstat实时抓取运行中JVM的统计快照——它轻量、无需额外依赖,且对应用影响极小。
获取目标Java进程PID并校验有效性
避免误采或失败,脚本需精准定位目标进程:
- 用
pgrep -f "java.*-jar.*app.jar"(按实际jar名调整)匹配主应用进程,比单纯pgrep java更可靠 - 检查PID是否存在且属当前用户:
kill -0 $PID 2>/dev/null,失败则退出并报错 - 可选:用
ps -p $PID -o args=二次确认命令行含预期参数,防同名进程干扰
用jstat采集并判断GC状态
执行jstat -gc $PID 1000 3(每秒采样1次,共3次),取最后一次结果分析。关键字段含义:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- FGCT(Full GC次数):3次采样间若增长>0,说明已触发Full GC,需告警
-
OGU(老年代使用量,单位KB)与OGC(老年代容量):计算
OGU/OGC*100,若>85%持续存在,预示OOM风险 - GCT(GC总耗时)与采样间隔对比:若单次GCT接近1000ms,说明STW时间过长
示例判断逻辑:[ $(echo "$ogu / $ogc * 100 >= 85" | bc -l) -eq 1 ] && echo "WARN: OldGen usage high"
立即学习“Java免费学习笔记(深入)”;
集成到部署流程并设定合理超时
将脚本作为部署最后一步调用,例如在Ansible的shell模块或Jenkins Pipeline的sh步骤中执行:
- 设置超时:用
timeout 60s ./gc_health_check.sh,避免因JVM未就绪无限等待 - 失败处理:脚本exit code非0时,立即中断部署,人工介入;不可静默忽略
- 日志留存:将
jstat输出和判断结果追加到/var/log/deploy/gc-check-$(date +%s).log,便于回溯

















