在Linux系统运行中,进程占用过多内存是常见故障,会造成系统响应缓慢、触发OOM杀进程等严重后果。要处理该问题,需从观察、定位、处置三个层面系统推进。

一、查看内存与进程占用情况
最基础的方式是使用系统自带命令观察实时状态。top命令能动态展示各进程RES字段即实际物理内存占用。
# 查看内存整体使用 free -h # 按内存占用排序查看进程 top -o %MEM
若需一次性获取快照,可用ps命令列出常驻内存集。
ps -eo pid,comm,rss,vsz --sort=-rss | head -n 10
二、定位异常进程原因
发现某个进程RSS远超预期时,应判断其为内存泄漏还是业务正常增长。可查看进程映射文件了解分配细节。
# 查看pid为1234的进程内存映射 cat /proc/1234/smaps | grep -i rss
对于Java等带虚拟机的服务,还需结合各自工具如jstat分析堆内情况。若是自研C++程序,可用valgrind做泄漏检查。
三、限制与优化进程内存
对确认异常但暂不能修改代码的进程,可使用cgroup限制其最大内存,避免拖垮整机。
# 创建内存限制组并限制为512M cgcreate -g memory:/lim_group echo 536870912 > /sys/fs/cgroup/memory/lim_group/memory.limit_in_bytes cgclassify -g memory:/lim_group 1234
同时可在启动脚本中用ulimit约束单进程虚拟内存。
ulimit -v 1048576 ./your_program
四、从根本上优化程序
长期方案仍是修复程序逻辑。常见做法包括减少全局缓存、及时释放句柄、避免频繁大对象分配。以下为简单C示例,展示错误与正确释放:
#include <stdlib.h>
void leak() {
int *p = (int*)malloc(1024 * sizeof(int));
// 错误:未释放
}
void ok() {
int *p = (int*)malloc(1024 * sizeof(int));
free(p); // 正确:使用完释放
}
五、系统级兜底策略
可开启OOM调节,让核心服务不易被杀,并配置监控告警。修改/proc对应oom_score_adj即可。
# 降低pid为5678进程被OOM杀掉的概率 echo -500 > /proc/5678/oom_score_adj
通过上述步骤,运维人员能高效解决Linux进程占用过多内存的问题,维持系统平稳。