ps aux --sort=-%mem 是最常用、最轻量的内存占用百分比排行方案,适合脚本调用或快速排查;%mem 表示物理内存占用百分比,排序结果直观反映“谁吃内存最多”,配合 head -n 10 可限制输出、grep -v 过滤自身进程。

ps aux --sort=-%mem 直接看内存占用百分比排行
这是最常用、最轻量的方案,适合脚本调用或快速排查。它不依赖额外安装,输出稳定,字段含义明确。
-
%MEM是物理内存占用百分比,按此排序最贴近“谁吃内存最多”的直觉判断 -
RSS(等同于RES)是实际驻留物理内存(KB),数值大但没总内存参照时难评估严重性 - 加
| head -n 10可限制输出条数,避免刷屏;加| grep -v "ps "能过滤掉自身进程干扰 - 注意:
ps aux中的USER列可能被截断,若需完整用户名,改用ps eo pid,user,%mem,rss,comm,args --sort=-%mem
top 按 M 键进入交互式内存排序
适合需要动态观察、怀疑内存泄漏或想同时盯住 CPU/内存双指标的场景。它的排序不是一次性快照,而是持续刷新。
- 启动后直接按
M(大写),%MEM列即变为降序主键;再按一次切换升序 - 别只看
%MEM,同步关注RES(KB)和VIRT:一个进程%MEM高但RES才几十 MB,可能是小进程占了大比例(比如总内存只有 2GB);而VIRT远大于RES说明用了大量 mmap 或 swap,未必真在吃物理内存 - 按
c可展开完整命令行,确认是不是你预期的那个服务(比如java进程到底跑的是哪个 jar) - 退出用
q,不是Ctrl+C—— 后者会把top进程留在后台继续跑
htop 查看带颜色和树形结构的内存排行
如果你已经装了 htop,它比 top 更直观,尤其适合识别父子进程间的内存归属问题(比如某个主进程 fork 出一堆 worker,总内存该算谁?)。
- 安装:
sudo apt install htop(Debian/Ubuntu)或sudo yum install htop(RHEL/CentOS) - 启动后按
F6→ 选MEM%→Enter,立刻按内存百分比排序 - 按
t切换树状视图,能看清哪些子进程是某个父进程拉起来的;按Shift+K可折叠/展开,避免被海量线程淹没 - 注意:
htop默认显示的MEM%是基于RES计算的,但分母是总物理内存(不含 swap),和ps一致;不过它的列宽自适应,COMMAND不会被截断
查具体 PID 的真实 RSS 值,绕过 ps/top 的统计偏差
当发现某个进程在 ps 或 top 里显示内存异常高,但实际行为不像——比如 Java 应用 %MEM 达到 80%,却没 OOM,这时要深入看内核原始数据。
- 用
cat /proc/<pid>/status | grep VmRSS</pid>,输出如VmRSS: 1245678 kB,这个值最接近内核眼中的“真实物理内存占用” -
ps和top的RSS字段其实来自同一来源,但某些内核版本或容器环境(如 cgroups v2)下,ps可能因权限或缓存延迟显示旧值 - 如果
VmRSS远低于ps显示的RSS,检查是否启用了透明大页(THP)或内存压缩(zram),它们会让内核统计口径和用户态工具不一致 - 不要用
pmap -x <pid></pid>的“total”行当 RSS —— 它包含共享库重复计数,比实际高得多
%MEM 看占比,RES/RSS 看绝对量,VmRSS 看内核真相——三者不一致时,得先搞清当前系统用的是 cgroups v1 还是 v2、有没有启用 THP、是否在容器里运行。这些细节不确认,光排序没用。











