温馨提示×

linux进程内存怎么分析

小樊
75
2026-09-18 15:21:49
栏目: 智能运维

在 Linux 下分析进程内存,通常分为「看整体占用」「看内存分布」「找内存泄漏/异常」几个层次。下面按实用顺序给你一套方法。


一、快速看进程用了多少内存

1. top / htop

top -p <pid>

关注:

  • RES(常驻内存,真实占用物理内存)
  • VIRT(虚拟内存,包含未分配/映射的部分)
  • SHR(共享内存)

VIRT 大不一定有问题,RES 才是关键。

2. ps

ps -o pid,rss,vsz,comm -p <pid>
  • RSS:物理内存(KB)
  • VSZ:虚拟内存(KB)

二、看进程内存详细分布(非常重要)

1. /proc/<pid>/status

cat /proc/<pid>/status

关键字段:

  • VmRSS:常驻内存
  • VmSize:虚拟内存
  • VmExe / VmLib / VmData / VmStk

2. /proc/<pid>/maps

cat /proc/<pid>/maps

可以看到:

  • 堆(heap)
  • 栈(stack)
  • 动态库
  • 匿名内存(可能是泄漏)

示例:

7f8b2c000000-7f8b2c021000 rw-p 00000000 00:00 0  [heap]

3. /proc/<pid>/smaps(最推荐)

cat /proc/<pid>/smaps

或汇总:

grep -i rss /proc/<pid>/smaps | awk '{s+=$2} END{print s" kB"}'

可以看到:

  • 每个映射的 RSS / PSS / Private
  • PSS(按比例共享内存,最科学)

三、分析内存组成(堆 / 栈 / 共享库)

1. pmap

pmap -x <pid>

或:

pmap -XX <pid>

能看到:

  • 总内存
  • 各段大小
  • 匿名内存(常常和泄漏有关)

四、排查内存泄漏(C / C++ 程序)

1. valgrind(最经典)

valgrind --tool=memcheck --leak-check=full ./your_program

适合:

  • 开发阶段
  • 离线分析

2. AddressSanitizer(推荐,性能更好)

编译时加:

-g -fsanitize=address

运行即可检测泄漏和越界。


五、运行时动态观察内存增长

1. 定时采样

while true; do
  grep VmRSS /proc/<pid>/status
  sleep 1
done

2. 观察匿名内存是否持续增长

grep anon /proc/<pid>/smaps

六、Java / Python 等语言专项

Java

jstat -gc <pid>
jmap -heap <pid>

注意:JVM 内存 ≠ RSS

Python

pip install memory_profiler

或:

tracemalloc

七、常见结论速查

现象 可能原因
RSS 持续增长 内存泄漏
VIRT 很大 映射多,不一定问题
匿名内存大 堆分配未释放
SHR 大 共享库 / 多进程
突然暴涨 缓存 / 大对象

八、一句话总结

看总量用 top/ps,看分布用 /proc/<pid>/smaps,看泄漏用 valgrind/asan。

如果你愿意,可以告诉我:

  • 是什么语言(C / C++ / Java / Go / Python)
  • 是线上问题还是开发调试
  • 是否有内存持续增长

我可以直接给你一套针对性分析命令。

0 踩