在 Linux 下分析进程内存,通常分为「看整体占用」「看内存分布」「找内存泄漏/异常」几个层次。下面按实用顺序给你一套方法。
top / htoptop -p <pid>
关注:
VIRT 大不一定有问题,RES 才是关键。
psps -o pid,rss,vsz,comm -p <pid>
RSS:物理内存(KB)VSZ:虚拟内存(KB)/proc/<pid>/statuscat /proc/<pid>/status
关键字段:
VmRSS:常驻内存VmSize:虚拟内存VmExe / VmLib / VmData / VmStk/proc/<pid>/mapscat /proc/<pid>/maps
可以看到:
示例:
7f8b2c000000-7f8b2c021000 rw-p 00000000 00:00 0 [heap]
/proc/<pid>/smaps(最推荐)cat /proc/<pid>/smaps
或汇总:
grep -i rss /proc/<pid>/smaps | awk '{s+=$2} END{print s" kB"}'
可以看到:
pmappmap -x <pid>
或:
pmap -XX <pid>
能看到:
valgrind(最经典)valgrind --tool=memcheck --leak-check=full ./your_program
适合:
AddressSanitizer(推荐,性能更好)编译时加:
-g -fsanitize=address
运行即可检测泄漏和越界。
while true; do
grep VmRSS /proc/<pid>/status
sleep 1
done
grep anon /proc/<pid>/smaps
jstat -gc <pid>
jmap -heap <pid>
注意:JVM 内存 ≠ RSS
pip install memory_profiler
或:
tracemalloc
| 现象 | 可能原因 |
|---|---|
| RSS 持续增长 | 内存泄漏 |
| VIRT 很大 | 映射多,不一定问题 |
| 匿名内存大 | 堆分配未释放 |
| SHR 大 | 共享库 / 多进程 |
| 突然暴涨 | 缓存 / 大对象 |
看总量用
top/ps,看分布用/proc/<pid>/smaps,看泄漏用valgrind/asan。
如果你愿意,可以告诉我:
我可以直接给你一套针对性分析命令。