温馨提示×

CentOS Java应用故障排查步骤

小樊
37
2025-11-27 17:56:05
栏目: 编程语言

CentOS Java应用故障排查步骤

一 快速定位与日志收集

  • 确认进程与端口:使用命令查看Java进程与端口占用,例如:ps -ef | grep java;netstat -tulpen | grep <端口> 或 ss -lntp | grep <端口>。定位 PID 与监听端口,便于后续排查。
  • 查看应用日志:优先检查应用日志目录(常见如 logs/catalina.outapplication.log),使用 tail -f /path/to/app.log 实时观察;对异常关键字进行过滤:grep -i “ERROR|Exception” /path/to/app.log。
  • 查看系统与服务日志:若以 systemd 管理,使用 journalctl -u <服务名> --since “10 minutes ago” -e 查看最近错误;必要时查看系统日志 journalctl -n 200。
  • 环境变量与版本:核对 JAVA_HOMEPATH 与运行时版本,执行 echo $JAVA_HOME、java -version、javac -version,确保与应用兼容。
  • 资源与磁盘:检查 CPU/内存与磁盘空间,执行 top/htop、free -m、df -h,避免因资源不足导致启动或运行异常。

二 常见故障场景与处理

  • 端口冲突:启动失败且提示端口被占用时,使用 netstat/ss 找到占用进程 PID,评估后 kill 或修改应用配置更换端口。
  • 类路径或依赖问题:出现 ClassNotFoundException/NoClassDefFoundError 时,核对 -cp/-classpath 或构建配置(如 Maven/Gradle),确保依赖完整;必要时用 jar tf yourApp.jar 检查可执行 JAR 是否包含主类与依赖。
  • JVM 内存配置不当:若频繁 OutOfMemoryError 或 GC 异常,核对 -Xms/-Xmx 等参数,避免设置超过物理内存;必要时降低堆大小或优化应用内存使用。
  • 主类未找到或启动脚本错误:确认可执行 JAR 的 Main-Class 正确,启动脚本中 JAVA_HOME、JVM 参数与类路径配置无误。
  • 版本不兼容:编译与运行 JDK 版本需与应用兼容,避免因版本差异导致类文件或 API 不可用。

三 JVM 层诊断与转储

  • 线程与死锁:获取 PID 后执行 jstack -l > threads.txt,检查 BLOCKED/DEADLOCK 线程;结合 top -H -p 定位高 CPU 线程,将线程号转 16 进制后在 jstack 输出中比对。
  • GC 与内存压力:使用 jstat -gc 1000 观察 YGC/YGCT、FGC/FGCT、GCT 等指标,判断是否存在频繁 Full GC 或晋升失败。
  • 堆转储与分析:发生 OOM 时执行 jmap -dump:format=b,file=heap.hprof 获取堆转储,使用 Eclipse MAT 分析泄漏对象与引用链。
  • 可视化与在线分析:通过 JConsole/VisualVM 观察堆、线程、类加载与 MBeans,必要时远程连接进行诊断。

四 作为 systemd 服务时的排查与优化

  • 服务状态与日志:使用 systemctl status <服务名> 查看运行状态与最近日志;用 journalctl -u <服务名> -f 实时跟踪,结合 --since 精确定位时间段。
  • 资源配置:在 systemd 服务单元中合理配置 MemoryLimit=CPUQuota=LimitNOFILE= 等,避免资源争用导致异常退出。
  • 优雅启停:确保 Type=notify 或正确 ExecStart/ExecStop 配置,必要时设置 TimeoutStopSec,避免 kill -9 造成数据不一致。
  • 日志轮转与保留:为服务日志配置 logrotate(/etc/logrotate.d/),设置按日轮转、压缩与保留份数,防止磁盘被撑满。

五 一键排查命令清单

  • 进程与端口:ps -ef | grep java;ss -lntp | grep <端口>;netstat -tulpen | grep <端口>
  • 日志:tail -f /opt/app/logs/application.log;grep -i “ERROR|Exception” /opt/app/logs/*.log;journalctl -u myapp.service --since “10m” -e
  • 资源:top/htop;free -m;df -h
  • JVM:jps;jstack -l > threads.txt;jstat -gc 1000;jmap -dump:format=b,file=heap.hprof
  • 环境:echo $JAVA_HOME;java -version;javac -version;jar tf app.jar | grep -i main

0