在 Debian 系统中遇到进程内存不足(OOM,Out of Memory)时,可以从排查、临时缓解、系统级优化、程序级优化几个层面来处理。下面按常见场景给你一套实用方案。
free -h
关注:
available(可用内存)swap(是否用完)top
# 或
htop
看:
RES / %MEM 最高kswapd0 占用 CPU 很高(说明在疯狂 swap)dmesg | tail -50
journalctl -k | tail -50
如果看到类似:
Out of memory: Kill process 1234 (java) score 800 or sacrifice child
说明 OOM Killer 已触发。
sync
echo 3 > /proc/sys/vm/drop_caches
仅释放 page cache,不释放正在使用的内存
如果根本没有 swap 或 swap 太小:
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
✅ 适合:
如果是某个程序(如 Java / Python)吃光内存:
systemd-run --scope -p MemoryMax=2G your_command
查看当前策略:
cat /proc/sys/vm/overcommit_memory
建议:
# 允许适度超分配(适合大多数服务)
echo 1 > /proc/sys/vm/overcommit_memory
永久生效:
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
sysctl -p
cat /proc/sys/vm/swappiness
建议服务器设为:
echo 10 > /proc/sys/vm/swappiness
永久:
echo "vm.swappiness=10" >> /etc/sysctl.conf
ps aux --sort=-%mem | head
常见元凶:
-Xmx 设置过大)java -Xmx1g -Xms512m ...
如:
make -j2
而不是 make -j$(nproc)
dmesg | grep -i oom
echo -1000 > /proc/PID/oom_score_adj
✅ 以下情况建议直接升级内存:
| 现象 | 建议 |
|---|---|
| 偶尔 OOM | 加 swap |
| 某个程序吃光 | 限制该程序 |
| 长期内存不足 | 升级内存 |
| 编译 / 批处理 | 降低并发 |
| 数据库 | 调缓存参数 |
如果你愿意,可以告诉我:
我可以给你更精确的优化方案。