排查命令
systemctl管理Java进程无限重启问题
# 查看指定日期以来的相关报错日志
journalctl -u manage-service.service --since "2025-09-03 00:00:00" | grep "Main process exited" -C 5
系统资源限制或 OOM Killer 干预
# 查看内核日志中是否有 OOM 相关记录(关键词:out of memory、killed process)
grep -i 'out of memory' /var/log/kern.log
dmesg | grep -i 'killed process'
关联 OOM 进程与 support-service
- 确认 support-service 的运行 UID(缩小范围)
# 1. 查看 support-service 的 systemd 配置,确认运行用户
systemctl cat support-service.service | grep -i "User="
# 示例输出:User=1000(说明服务用 UID 1000 运行)
# 2. 若配置中无 User=,则默认用 root(UID 0)运行,可通过实时进程验证
# 查看当前 support-service 的运行 UID
ps aux | grep support-service | grep -v grep | awk '{print "PID:"$2, "UID:"$1, "进程名:"$11}'
# 示例输出:PID:919824 UID:1000 进程名:/usr/bin/java(和 OOM 日志的 UID 1000 匹配)
- 按 OOM 时间点,查 support-service 的历史 PID(精准匹配)
# 语法:journalctl -u 服务名 --since "OOM时间" --until "OOM时间+5分钟" | grep "Main process ID"
# 以 9 月 4 日 03:41 的 OOM 为例,查询该时间前后服务的 PID
journalctl -u support-service.service --since "2025-09-04 03:40:00" --until "2025-09-04 03:45:00" | grep -i "Main process ID"
- 结合内存特征二次验证(避免误判)
# 查看当前 support-service 的内存使用(对比 OOM 日志的 total-vm/anon-rss)
ps aux | grep support-service | grep -v grep | awk '{print "PID:"$2, "虚拟内存:"$5, "物理内存:"$6}'
# 示例输出:PID:919824 虚拟内存:6618000kB 物理内存:1031000kB
额外:如何避免 support-service 被 OOM 杀死?
- 增加服务内存限制
[Service]
MemoryLimit=2G # 限制最大内存为 2GB(可以不配, 看情况)
MemoryHigh=1.5G # 内存超过 1.5GB 时触发回收
# 配置后重启服务:
systemctl daemon-reload && systemctl restart support-service
- 优化应用内存配置
调整 Java 的 JVM 参数(如 -Xms512m -Xmx1500m),避免内存溢出: 在服务启动脚本中添加 JVM 参数,或通过 JAVA_OPTS 环境变量配置。
# 示例:在服务启动脚本中添加 JVM 参数
JAVA_OPTS="-Xms512m -Xmx1500m"
- 检查系统总内存
用 free -h
查看系统内存是否充足,若频繁 OOM,考虑扩容服务器内存。