如何分析linux下进程的内存占用情况
在 Linux 系统中,内存占用超过 60% 并不一定意味着“有问题”——Linux 的设计理念是 尽可能利用空闲内存做缓存(如 page cache、buffer cache),以提升性能。只有当 可用内存(available)不足 或 系统开始频繁使用 swap 时,才真正说明存在内存压力。
但如果你确实观察到系统变慢、OOM(Out-Of-Memory)错误、或想排查高内存占用的原因,可以按以下步骤进行分析:
🔍 第一步:确认是否真的“内存紧张”
运行:
bash
free -h
重点关注 available 列(不是 free!):
text
total used free shared buff/cache available
Mem: 7.7G 5.2G 100M 200M 2.4G 2.1G
Swap: 2.0G 100M
如果 available 还有 1–2GB 以上,即使 used 很高,系统依然健康。
如果 available 接近 0,且 swap 使用量持续增长,则说明内存不足。
💡 提示:used = total - free - buffers - cache,而 available ≈ free + reclaimable cache,更能反映实际可用内存。
🔍 第二步:找出占用内存最多的进程
方法 1:用 top 按内存排序
bash
top
然后按 Shift + M(大写 M),按 RES(常驻内存)降序排列。
关注列:
PID:进程 ID
USER:所属用户
RES:实际使用的物理内存(KB)
%MEM:占总内存百分比
COMMAND:进程名
方法 2:用 ps 命令直接列出高内存进程
bash
ps aux --sort=-%mem head -n 20
这会显示内存占用最高的前 20 个进程。
🔍 第三步:深入分析特定进程的内存使用
假设你发现某个进程(如 PID=1234)占用了大量内存:
查看其详细内存映射:
bash
cat /proc/1234/status grep -E "VmRSS VmSize"
VmRSS:实际使用的物理内存(等同于 top 中的 RES)
VmSize:虚拟内存大小(通常很大,不具参考价值)
查看内存分布(堆、栈、共享库等):
bash
cat /proc/1234/smaps awk '/^Size:/ { sum += $2 } END { print "Total Size:", sum, "kB" }'
或更详细地分析
pmap -x 1234
查看它打开了哪些文件/网络连接(可能泄露资源):
bash
lsof -p 1234
🔍 第四步:检查内核和缓存占用
有时高内存来自 内核缓存 或 slab 分配器(如 dentry、inode 缓存)。
查看 slab 内存使用:
bash
cat /proc/meminfo grep -i slab
或更详细
slabtop
如果 SReclaimable 很高(比如 >1GB),说明可回收的内核缓存多,这是正常的。你可以手动释放(仅用于测试,生产环境慎用):
bash
释放 page cache, dentries, inodes
echo 3 > /proc/sys/vm/drop_caches
⚠️ 注意:这只是临时释放缓存,不影响应用数据,但会降低后续 I/O 性能。
🔍 第五步:监控内存趋势与历史
实时监控:
bash
htop # 更友好的 top 替代
glances # 全局系统监控(需安装)
记录历史(需提前配置):
使用 sar(sysstat 包):
bash
sar -r 1 10 # 每秒采样一次,共 10 次
或启用 systemd-coredump、netdata、Prometheus + Node Exporter 等监控工具。
🔍 第六步:排查常见“内存泄漏”场景
场景 可能表现 排查方法
Java 应用 RES 持续增长,GC 后不下降 jstat -gc
Python/Node.js 内存泄漏 进程内存缓慢增长 使用 tracemalloc(Python)或 heapdump(Node.js)
数据库(MySQL/PostgreSQL) buffer pool 占用高 查看数据库配置(如 innodb_buffer_pool_size)
容器(Docker) 容器内进程看不到真实内存 用 docker stats 或 cgroup 查看
内核模块 bug slab 不断增长 slabtop 观察 kmalloc-*、dentry 等
✅ 总结:判断是否需要干预
情况 是否需要处理
available 内存充足,系统响应快 ❌ 不需要
available 很低,swap 使用高,系统卡顿 ✅ 需要
某个进程内存持续增长(疑似泄漏) ✅ 需要
缓存占高但可回收(drop_caches 能释放) ❌ 正常行为
🛠 快速诊断命令汇总:
bash
free -h
top (按 Shift+M)
ps aux --sort=-%mem head -10
cat /proc/meminfo grep -i available
slabtop
lsof -p <可疑PID>
如果你提供 free -h 和 ps aux --sort=-%mem head -5 的输出,我可以帮你具体分析是否异常。

浙公网安备 33010602011771号