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] 内核辅助映射区

image

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

image

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

  1. pmap

来源:是一个命令行工具,本质上是读取 /proc/$PID/maps 和 /proc/$PID/smaps,然后做格式化展示。

信息内容:主要显示内存映射(mapping)的区段,包含:

起始地址和结束地址

权限(rwx)

内存段大小、RSS、共享内存、私有内存

所属文件(比如二进制、动态库、匿名段)

特点:

信息较简洁,适合快速查看。

默认不会输出每个内存段的详细统计(除非加 -x 或 -X 参数)。

  1. /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等) 深入分析内存使用
posted @ 2025-07-31 18:47  LdreamerD  阅读(18)  评论(0)    收藏  举报