CentOS 监控 Java 应用的可落地方案
一 快速巡检与 JVM 自带工具
- 进程与基础信息
- 查看 Java 进程:jps -v、ps -ef | grep java,获取 PID 与启动参数。
- 资源占用:top -p 实时查看 CPU/内存;必要时配合 vmstat 1、iostat -x 1 观察系统层面瓶颈。
- JVM 运行时诊断
- GC 与内存:jstat -gcutil <间隔秒> <次数>,关注 YGC/YGCT、FGC/FGCT、GCT 与各区使用率。
- 线程与锁:jstack 抓取线程栈,排查 死锁/阻塞/长时间运行线程。
- 堆与对象:jmap -heap 查看堆配置与使用;jmap -dump:format=b,file=heap.hprof 导出快照(注意可能 STW,生产慎用)。
- 运行参数:jinfo 查看/调整部分 JVM 参数(如 -Xmx/-Xms 等,视版本支持)。
- 图形化工具(需能访问图形界面或配置远程 JMX)
- JConsole、VisualVM 直连本地或远程 JVM,查看 内存、线程、类加载、CPU 等视图。
二 面向生产的指标化监控 JMX Exporter + Prometheus + Grafana
- 指标暴露
- 方案 A(通用 Java):部署 JMX Exporter,将 JVM MBeans 转为 Prometheus 指标;应用启动参数加入 -javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent.jar=<端口>:/opt/jmx_exporter/config.yaml。
- 方案 B(Spring Boot):引入 Micrometer + Actuator,暴露 /actuator/prometheus 端点。
- 采集与存储
- Prometheus 配置 scrape:对通用 Java 用 job_name: ‘java-jmx’ 抓取 <主机>:<端口>/metrics;对 Spring Boot 用 job_name: ‘java-app’ 抓取 <主机>:<端口>/actuator/prometheus。
- 可视化与告警
- Grafana 接入 Prometheus 数据源,导入 JVM/Micrometer 仪表盘(如 JVM Overview、Spring Boot 2.x/3.x)。
- 在 Prometheus 配置 Alertmanager 规则(示例):当 JVM 堆使用率 > 80% 持续 5 分钟 或 Full GC 次数在 15 分钟内 > 3 次 触发告警。
三 远程诊断与可视化连接
- JMX 远程开启(示例,生产请开启认证与加密)
- 启动参数:
- -Dcom.sun.management.jmxremote
- -Dcom.sun.management.jmxremote.port=9010
- -Dcom.sun.management.jmxremote.authenticate=false
- -Dcom.sun.management.jmxremote.ssl=false
- 客户端工具:JConsole/VisualVM 通过 service:jmx:rmi:///jndi/rmi://<主机>:9010/jmxrmi 连接,在线查看 内存、线程、类、CPU 等。
- 安全建议
- 仅在内网开放 JMX/RMI;启用 用户名/密码 与 SSL/TLS;限制来源 IP;必要时通过 SSH 隧道 访问。
四 可用性守护与自动化恢复
- 进程存活与健康
- 定时巡检:用 crontab 执行脚本检查 PID 是否存在、端口是否监听、/health 是否 200,异常时 重启 并记录日志。
- 服务化托管:使用 systemd 管理应用,配置 Restart=on-failure、RestartSec=10,结合 ExecStart 指向启动脚本或 java -jar。
- 日志与诊断
- 统一日志:应用日志输出到 /var/log//;配合 journalctl -u 或 tail -f 实时排查。
- 故障现场:异常时自动执行 jstack > /var/log//jstack-$(date +%F-%H%M%S).log 与 jmap -dump(谨慎使用)保留证据。
五 关键指标与阈值示例
| 维度 |
关键指标 |
常用命令/来源 |
建议阈值与动作 |
| 进程存活 |
PID 是否存在、端口是否监听 |
jps/ps、netstat/ss |
不存在即告警并尝试重启 |
| CPU |
进程 CPU 占用 |
top -p |
持续 > 80% 告警,排查 GC/锁/热点 |
| 内存 |
堆使用率、GC 次数/时间 |
jstat -gcutil |
堆 > 80% 或 FGC 频繁 告警,检查对象增长与缓存策略 |
| 线程 |
线程总数、阻塞/等待数 |
jstack、VisualVM |
线程数突增或大量 BLOCKED/WAITING 告警,排查死锁与阻塞 |
| 类加载 |
已加载类数量 |
jstat -class |
持续增长伴 Perm/Metaspace 增长,检查类加载泄漏 |
| 响应健康 |
HTTP 200/503 |
Actuator/自定义健康 |
非 200 连续失败告警,联动重启或降级 |
以上方案可按需组合:命令行与 JVM 工具用于快速排障,JMX Exporter + Prometheus + Grafana用于长期观测与告警,systemd/crontab用于可用性守护。