系统内存不足OOM,挑了占用最大内存的springboot.jar 杀掉了。
springboot停止运行了,但是没有任何错误日志,怀疑被系统杀掉进程,查看内核日志。
1 | # 查看内核日志 |
从内核日志来看,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杀手已经回收了该进程的内存资源。
- 这一行表示
原因
物理内存只有 4G,Springboot 应用占用了 2G 内存 ( -Xms2048m -Xmx2048m )
而还有一些其他应用在同一台服务器跑,比如 redis , nodejs-server 。
其他应用需求内存大了之后,系统内存就不够用了,就触发系统的OOM。
所以内存还是不要一下子占用太多。

3个解决方案
增加系统内存:
- 如果可能,增加服务器的物理内存。
- 考虑使用更大的实例(如果你在云环境中运行)。
优化JVM参数:
调整JVM的堆内存大小,确保它不会超过系统可用内存。
可以使用以下参数来调整JVM的堆内存:
1
-Xms1024m -Xmx2048m
1 |
|
- 检查交换分区是否启用:
1
sudo swapon --show