CentOS Java如何进行故障恢复
导读:CentOS Java故障恢复实操手册 一 快速恢复步骤 确认状态与定位进程 查看Java进程:ps -ef | grep java、jps -l 查看资源与端口:top/htop、netstat -tulpen | grep 端口 或...
CentOS Java故障恢复实操手册
一 快速恢复步骤
- 确认状态与定位进程
- 查看Java进程:ps -ef | grep java、jps -l
- 查看资源与端口:top/htop、netstat -tulpen | grep 端口 或 ss -ltnp | grep 端口
- 安全停止与启动
- 优雅停止优先:kill -15 ;必要时再 kill -9
- 直接启动:java -jar /path/app.jar
- 建议使用服务管理:systemctl restart myapp 或脚本化启停
- 无法启动时优先排查
- 环境变量:echo $JAVA_HOME;版本:java -version
- 应用日志:如 catalina.out、application.log
- 端口冲突、依赖JAR、配置文件、系统资源(CPU/内存/磁盘)
二 稳定运行与自动恢复
- 使用 Systemd 托管(推荐)
- 创建服务文件:/etc/systemd/system/myapp.service
- 关键配置示例:
- Restart=on-failure、RestartSec=5、SuccessExitStatus=143
- ExecStart=/usr/bin/java -jar /opt/app/app.jar
- 常用命令:
- 重载与启停:systemctl daemon-reload、systemctl start|stop|restart|status myapp
- 开机自启:systemctl enable myapp
- 进程监控与自愈脚本
- 简单自愈脚本思路:检测进程是否存在,不存在则启动并记录日志;可配合 cron 定时巡检
- 第三方进程管理
- Supervisor:配置 autostart=true、autorestart=true,统一托管与日志轮转
三 常见故障定位与修复
- 内存与GC问题
- 观察GC与健康:jstat -gcutil
- 堆转储与分析:发生 OutOfMemoryError 时生成 Heap Dump,用 Eclipse MAT 分析泄漏
- 启动参数建议:设置 -Xms/-Xmx、选择合适的 GC(如 G1),并开启 GC 日志
- CPU飙高与线程问题
- 定位线程:top -Hp 找高占用线程ID
- 抓取栈:jstack > stack.log,将线程ID转16进制后在栈中检索
- 端口冲突
- 检查占用:netstat -tulpen | grep 端口 或 ss -ltnp | grep 端口
- 处理:释放占用进程或修改应用端口配置
- “无法创建Java虚拟机”
- 可能原因:内存不足、-Xms/-Xmx 配置不当、Java版本不兼容
- 处理:free -m 检查内存;调整堆参数;确认 java -version 与应用兼容;必要时设置 JAVA_HOME/PATH
- 系统层被OOM Killer终止
- 检查系统日志:grep -i ‘killed process’ /var/log/messages 或 journalctl
- 处理:降低应用内存、优化JVM、扩容内存或配置合理的OOM策略
四 日志与现场保留
- JVM致命错误日志
- 崩溃时生成 hs_err_pid.log,位于工作目录或 -XX:ErrorFile= 指定路径
- 关注头部异常(如 EXCEPTION_ACCESS_VIOLATION、SIGSEGV)、Problematic frame、线程与寄存器信息
- GC与运行日志
- 开启 GC 详细日志与时间戳:-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/gc-$(date +%s).log
- OOM与堆转储
- 发生OOM时自动转储并退出:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/dump-$(date +%s).hprof
- 应用日志
- 按应用约定查看:如 catalina.out(Tomcat)、application.log(Spring Boot)
五 一键恢复脚本模板
#!/usr/bin/env bash
set -euo pipefail
APP_JAR="/opt/app/app.jar"
LOG_DIR="/var/log/myapp"
PID_FILE="/var/run/myapp.pid"
JAVA="/usr/bin/java"
mkdir -p "$LOG_DIR"
start() {
if [ -f "$PID_FILE" ] &
&
kill -0 "$(cat "$PID_FILE")" >
/dev/null 2>
&
1;
then
echo "Already running (PID=$(cat $PID_FILE))"
return 0
fi
nohup "$JAVA" -jar "$APP_JAR" >
>
"$LOG_DIR/run.log" 2>
&
1 &
echo $! >
"$PID_FILE"
echo "Started (PID=$!)"
}
stop() {
if [ -f "$PID_FILE" ];
then
PID=$(cat "$PID_FILE")
kill -15 "$PID" || true
for i in {
1..10}
;
do
kill -0 "$PID" >
/dev/null 2>
&
1 || {
rm -f "$PID_FILE";
echo "Stopped";
return 0;
}
sleep 1
done
kill -9 "$PID" || true
rm -f "$PID_FILE"
echo "Force stopped"
else
echo "Not running"
fi
}
restart() {
stop;
start;
}
case "${
1:-}
" in
start|stop|restart) "$1" ;
;
*) echo "Usage: $0 {
start|stop|restart}
" ;
;
esac
- 建议配合 systemd 或 Supervisor 使用,以获得更完善的进程监控与自动重启能力。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: CentOS Java如何进行故障恢复
本文地址: https://pptw.com/jishu/774251.html
