一、使用systemd实现进程守护与自动重启
systemd是Ubuntu推荐的进程管理工具,可确保Java服务在崩溃、系统重启后自动恢复,是稳定运行的核心保障。
/etc/systemd/system/目录下新建.service文件(如java-app.service),内容需包含以下关键配置:[Unit]
Description=Java Application Service
After=network.target # 确保网络就绪后启动
[Service]
User=your_username # 指定运行用户(避免使用root)
Group=your_group # 指定运行组
ExecStart=/usr/bin/java -jar /path/to/your/app.jar # 绝对路径执行命令
WorkingDirectory=/path/to/your/app # 设置工作目录
Restart=always # 任何退出状态均自动重启
RestartSec=10 # 重启间隔10秒(避免频繁重启)
StandardOutput=syslog # 输出重定向到syslog
StandardError=syslog # 错误输出重定向到syslog
SuccessExitStatus=143 # 正常停止状态码(如SIGTERM)
[Install]
WantedBy=multi-user.target # 设置开机自启
sudo systemctl daemon-reload # 重新加载配置
sudo systemctl start java-app.service # 启动服务
sudo systemctl enable java-app.service # 开机自启
sudo systemctl status java-app.service # 查看状态(关键:确认无报错)
二、合理配置JVM参数
JVM参数直接影响Java服务的性能与稳定性,需根据服务器资源与应用特性调整:
-Xms(初始堆大小)和-Xmx(最大堆大小)限制堆内存,避免因内存溢出导致崩溃。建议设置为服务器可用内存的70%-80%,例如:-Xms512m -Xmx1024m # 初始512MB,最大1GB
G1GC(默认),低延迟应用推荐ZGC(需JDK 11+):-XX:+UseG1GC # 启用G1GC
-XX:MaxGCPauseMillis=200 # 目标最大GC停顿时间(毫秒)
-XX:MetaspaceSize和-XX:MaxMetaspaceSize:-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m
三、完善的日志管理与监控
日志是排查问题的关键,需规范日志输出与存储:
logback.xml):<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/java-app/app.log</file> # 日志路径
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/java-app/app.%d{yyyy-MM-dd}.log</fileNamePattern> # 按天滚动
<maxHistory>30</maxHistory> # 保留30天日志
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> # 日志格式
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
rsyslog或Logrotate管理日志文件,避免日志过大占用磁盘空间。例如,Logrotate配置(/etc/logrotate.d/java-app):/var/log/java-app/*.log {
daily # 每天轮转
rotate 7 # 保留7天
compress # 压缩旧日志
delaycompress # 延迟压缩(避免影响当前日志写入)
missingok # 文件不存在不报错
notifempty # 空文件不轮转
create 0640 your_username your_group # 创建新日志文件权限
sharedscripts
postrotate
/bin/kill -HUP $(cat /var/run/java-app.pid 2>/dev/null) 2>/dev/null || true # 通知应用重新打开日志文件
endscript
}
四、系统资源监控与告警
实时监控系统资源(CPU、内存、磁盘)使用情况,及时发现瓶颈或异常:
top(实时查看进程资源占用)、df -h(查看磁盘空间)、free -m(查看内存使用)等命令定期检查。五、代码层面优化
从根源减少稳定性问题,需优化代码逻辑:
StringBuilder代替字符串拼接(避免创建大量临时对象)。try-catch块),避免未处理异常导致服务崩溃。例如:try {
// 业务逻辑
} catch (Exception e) {
logger.error("业务处理异常", e); // 记录异常堆栈
// 根据异常类型进行恢复或降级处理
}
六、依赖服务的高可用
若Java服务依赖数据库、Redis等外部服务,需确保依赖服务的高可用: