一、使用Systemd实现Java服务守护
将Java应用配置为Systemd服务是确保其稳定运行的基础,可实现开机自启、崩溃自动重启、统一管理等核心需求。
/etc/systemd/system/目录下创建以.service结尾的文件(如myapp.service),内容需包含以下关键配置:[Unit]
Description=My Java Application # 服务描述
After=network.target # 依赖网络服务启动
[Service]
User=appuser # 指定运行用户(避免root)
Group=appgroup # 指定运行用户组
WorkingDirectory=/home/appuser/app # 应用工作目录
ExecStart=/usr/bin/java -jar /home/appuser/app/myapp.jar # 启动命令
ExecStop=/bin/kill -15 $MAINPID # 停止命令(发送SIGTERM信号)
Restart=always # 异常退出时自动重启
RestartSec=10 # 重启间隔10秒
Environment="JAVA_OPTS=-Xms512m -Xmx1024m" # JVM内存参数
Environment="SPRING_PROFILES_ACTIVE=prod" # 应用环境变量
StandardOutput=journal # 标准输出接入journalctl
StandardError=journal # 标准错误接入journalctl
SyslogIdentifier=myapp # 日志标识
[Install]
WantedBy=multi-user.target # 多用户模式下启动
sudo systemctl daemon-reload # 重新加载Systemd配置
sudo systemctl enable myapp.service # 设置开机自启
sudo systemctl start myapp.service # 启动服务
sudo systemctl status myapp.service(可查看运行状态、日志摘要)sudo systemctl stop myapp.servicesudo systemctl restart myapp.servicejournalctl -u myapp.service -f(跟踪最新日志)journalctl -u myapp.service --since "1 hour ago"(按时间筛选)二、优化JVM参数提升稳定性
合理的JVM配置可避免内存溢出、频繁GC等问题,需根据应用实际情况调整:
-Xms)和最大堆内存(-Xmx),建议两者相等以减少GC次数(如-Xms1g -Xmx1g)。-XX:+UseG1GC -XX:MaxGCPauseMillis=200)。-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump.hprof,当发生OOM时自动生成堆转储文件,便于后续分析。-Xss256k,默认1MB)三、完善日志管理与分析
规范的日志管理是排查问题的关键,需实现日志分类、轮转、集中存储:
ERROR或WARN)、输出格式(包含时间、线程、类名)及轮转策略。例如Log4j2的RollingFile配置:<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app-%d{yyyy-MM-dd}.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/> # 按天轮转
<SizeBasedTriggeringPolicy size="10 MB"/> # 单个文件超过10MB触发
</Policies>
<DefaultRolloverStrategy max="10"/> # 保留最近10个文件
</RollingFile>
StandardOutput和StandardError将应用日志接入journalctl,使用journalctl -u myapp.service查看服务相关日志。logrotate工具(Linux自带)对日志文件进行定期压缩、删除。配置示例:/path/to/java/logs/*.log {
daily # 每天轮转
rotate 7 # 保留7天
compress # 压缩旧日志
missingok # 文件不存在时不报错
notifempty # 日志为空时不轮转
create 0644 root root # 新日志文件权限
}
grep、awk等命令过滤关键日志(如ERROR级别),结合Shell脚本发送邮件/短信报警四、加强系统资源监控与告警
实时监控系统资源(CPU、内存、磁盘)可提前发现瓶颈,避免服务因资源耗尽崩溃:
top(按1查看每个核心的使用率)、htop(更直观)free -h(显示人类可读格式)、vmstat 1(实时监控内存、交换分区)df -h(查看各分区使用情况)、du -sh /path/to/dir(查看目录大小)iostat -x 1(监控磁盘读写速率)jstat(监控GC情况)、jstack(查看线程堆栈,排查死锁)、jmap(查看堆内存分布,排查内存泄漏)等工具。例如:jstat -gcutil <pid> 1000 5 # 每1秒监控一次GC情况,共5次
jstack <pid> > thread_dump.log # 导出线程堆栈到文件
五、确保应用自身健壮性
try {
// 数据库操作
} catch (SQLException e) {
logger.error("数据库连接失败", e);
// 进行重试或降级处理
}
netstat -tlnp | grep :8080(替换为实际端口)查看端口占用情况。chown -R appuser:appgroup /home/appuser/app)六、自动化部署与回滚
使用自动化工具减少人为错误,提高部署效率: