OOM情况的处理
inspect查看容器断开的原因
1 | { |
ExitCode是退出码,137为内存溢出
查看容器内存限制
1 | docker inspect pml | grep "Memory" |
如果 Memory 值为 0,说明没有内存限制。如果有值,比如 2147483648(即 2GB),说明容器最多只能使用 2GB 内存,可能不够。
启用swap
什么是Swap?
Swap(交换空间)是一种 虚拟内存,当物理内存(RAM)不足时,操作系统会把不常用的内存数据 临时存放到硬盘(Swap 空间)上,以避免进程因内存不足而被杀死。
Swap的作用
- 防止 OOM(内存不足)
- 当物理内存不够时,系统会把一些暂时不用的数据转移到 Swap,而不是直接杀死进程(例如你的 Java 进程)。
- 提升系统稳定性
- 如果服务器运行多个进程,并且偶尔内存峰值较高,Swap 能起到缓冲作用,防止进程被强制终止。
- 支持更大的并发
- 服务器可能需要运行多个应用,物理内存有限时,Swap 允许更好地分配资源,减少应用崩溃的风险。
- 防止 OOM(内存不足)
Swap的缺点
- 速度慢:Swap 依赖硬盘,访问速度远远慢于 RAM,使用过多会导致系统变慢(特别是 HDD)。
- 可能影响性能:如果系统频繁使用 Swap,可能会导致 高 IO 负载,降低整体性能。
💡 解决方案:
- 建议只把 Swap 作为备用,不要让 Swap 变成主要内存!
- 如果 Swap 使用量过高,说明物理内存不够,建议增加 RAM。
- 对于 Java 应用,建议调整
-Xmx以减少内存占用,而不是依赖 Swap。
创建swap(2g)
1 | fallocate -l 2G /swapfile |
确认swap是否启用
1 | free -m |
让 Swap 在重启后仍然生效
1 | echo '/swapfile swap swap defaults 0 0' >> /etc/fstab |
附:启动容器的指令
1 | docker run -d --memory="2g" --memory-swap="2g" -p 8080:8080 \ |
当出现oom时生成dump日志
1 | -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 竹兰小筑!
评论





