咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

SpringBoot被系统OOM杀进程分析

系统内存不足OOM,挑了占用最大内存的springboot.jar 杀掉了。

springboot停止运行了,但是没有任何错误日志,怀疑被系统杀掉进程,查看内核日志。

1
2
3
4
5
6
7
8
# 查看内核日志
$ dmesg

[85900608.976839] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-0.slice/session-171735.scope,task=java,pid=871919,uid=0

[85900608.976935] Out of memory: Killed process 871919 (java) total-vm:4945540kB, anon-rss:1795188kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:3964kB oom_score_adj:0

[85900609.045077] oom_reaper: reaped process 871919 (java), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

从内核日志来看,Spring Boot应用被Linux系统的OOM(Out of Memory)杀手进程终止了。这通常是因为系统内存不足,内核为了保证系统的稳定运行,选择了终止占用大量内存的进程。

分析日志

  • [85900608.976839] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-0.slice/session-171735.scope,task=java,pid=871919,uid=0
    • 这一行表明 OOM 杀手正在考虑终止进程。
  • [85900608.976935] Out of memory: Killed process 871919 (java) total-vm:4945540kB, anon-rss:1795188kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:3964kB oom_score_adj:0
    • 这一行明确指出进程ID为871919的Java进程被终止,因为它占用了大量的内存(1795188kB)。
  • [85900609.045077] oom_reaper: reaped process 871919 (java), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
    • 这一行表示 OOM 杀手已经回收了该进程的内存资源。

原因

物理内存只有 4GSpringboot 应用占用了 2G 内存 ( -Xms2048m -Xmx2048m

而还有一些其他应用在同一台服务器跑,比如 redis , nodejs-server

其他应用需求内存大了之后,系统内存就不够用了,就触发系统的OOM。

所以内存还是不要一下子占用太多。

3个解决方案

  1. 增加系统内存

    • 如果可能,增加服务器的物理内存。
  • 考虑使用更大的实例(如果你在云环境中运行)。
  1. 优化JVM参数

    • 调整JVM的堆内存大小,确保它不会超过系统可用内存。

    • 可以使用以下参数来调整JVM的堆内存:

      1
      -Xms1024m -Xmx2048m
1
2
3
4
5
6
7
8
9
10
11
12
13
     
初始堆内存1G,最大内存2G

- 根据实际情况调整 `-Xms` 和 `-Xmx` 的值。

3. **启用交换分区**:
- 如果物理内存不足,可以启用交换分区(swap)来增加虚拟内存。
- 创建交换文件:
```sh
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
  • 检查交换分区是否启用:
    1
    sudo swapon --show