smaps
smaps 是 Linux 提供的 进程内存段信息,比 /proc/$pid/maps 更详细,主要用于分析实际内存占用(如 RSS、匿名内存、共享情况等)。
每个“段”通常对应一段 mmap 区域,格式如下:
text
复制
编辑
00400000-00452000 r-xp 00000000 08:01 131073 /usr/bin/myprogram
Size: 328 kB
Rss: 320 kB
Pss: 320 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 320 kB
Private_Dirty: 0 kB
Referenced: 320 kB
Anonymous: 0 kB
AnonHugePages: 0 kB
...
第一行,mmap 段的来源:[heap]、[stack]、[anon]、文件路径等,典型的段类型有哪些?代表什么意义?
| 段名/路径 | 含义 |
|---|---|
/usr/lib/... 或 /lib/... |
动态链接库映射的段,比如 libc、libstdc++等 |
[heap] |
堆区,程序通过 malloc/new 分配的堆内存来自此区域 |
[stack] |
主线程的栈空间 |
[anon] 或无 path |
匿名 mmap 区段(例如 jemalloc/tcmalloc 的 arena,profiler 分配块) |
| 可执行文件路径 | 程序本身的代码段、数据段等 |
[vdso], [vsyscall] |
内核辅助映射区 |

rw-p 区域通常是 malloc 分配的堆空间


anon段,[anon] 区段的显著增量是由 heap profiler 用 mmap 分配的巨大 buffer pool 造成的

- pmap
来源:是一个命令行工具,本质上是读取 /proc/$PID/maps 和 /proc/$PID/smaps,然后做格式化展示。
信息内容:主要显示内存映射(mapping)的区段,包含:
起始地址和结束地址
权限(rwx)
内存段大小、RSS、共享内存、私有内存
所属文件(比如二进制、动态库、匿名段)
特点:
信息较简洁,适合快速查看。
默认不会输出每个内存段的详细统计(除非加 -x 或 -X 参数)。
- /proc/$PID/smaps
来源:Linux 内核 procfs 提供的详细进程内存映射信息。
信息内容:在 /proc/$PID/maps 的基础上,增加了更细的统计数据,比如:
Size / Rss / Pss / Shared_Clean / Shared_Dirty / Private_Clean / Private_Dirty
Referenced / Anonymous / LazyFree
AnonHugePages / ShmemPmdMapped / FilePmdMapped
KernelPageSize / MMUPageSize
以及每个 VMA 的内存使用细节
特点:
数据比 pmap 更完整,可以精确区分不同来源的内存消耗(匿名内存、文件映射、共享内存等)。
常用于内存泄漏分析、驻留内存(RSS)对比、HugePage 占用分析等。
| 工具/文件 | 内容层次 | 是否直接来自内核 | 适用场景 |
|---|---|---|---|
pmap |
概览(简化版 smaps) | 读取 /proc/$PID/maps/smaps 后加工 |
快速查看进程内存分布 |
/proc/$PID/maps |
只包含区段地址、权限、文件 | 是 | 映射布局 |
/proc/$PID/smaps |
详细统计(每段的RSS、PSS等) | 是 | 深入分析内存使用 |

浙公网安备 33010602011771号