## systemctl管理Java进程无限重启问题

```bash
# 查看指定日期以来的相关报错日志
journalctl -u manage-service.service --since "2025-09-03 00:00:00" | grep "Main process exited" -C 5
```

## 系统资源限制或 OOM Killer 干预

```bash
# 查看内核日志中是否有 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（缩小范围）

```bash
# 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（精准匹配）

```bash
# 语法：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"
```

- 结合内存特征二次验证（避免误判）

```bash
# 查看当前 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 杀死？

- 增加服务内存限制

```bash
[Service]
MemoryLimit=2G  # 限制最大内存为 2GB(可以不配, 看情况)
MemoryHigh=1.5G # 内存超过 1.5GB 时触发回收
```

```bash
# 配置后重启服务：
systemctl daemon-reload && systemctl restart support-service
```

- 优化应用内存配置

调整 Java 的 JVM 参数（如 -Xms512m -Xmx1500m），避免内存溢出：
在服务启动脚本中添加 JVM 参数，或通过 JAVA_OPTS 环境变量配置。

```bash
# 示例：在服务启动脚本中添加 JVM 参数
JAVA_OPTS="-Xms512m -Xmx1500m"
```

- 检查系统总内存

用 `free -h` 查看系统内存是否充足，若频繁 OOM，考虑扩容服务器内存。