上一篇介绍了:进程内存分布--之单线程代码来内存分布呈现memory-layout.cpp
这里我们使用smaps将更加形象的的体现内存分布,smaps文件是Linux的proc文件系统提供的一种可以查看内存资源使用情况的方法,Linux系统中运行的库、堆、栈等信息都可在smaps中查看。
/proc/PID/smaps显示整体如下:
cat /proc/PID/smaps这个显示的更详细一点:每一行依次对应的是:地址范围、权限、偏移量、设备、文件inode、映射对象
第1行 [可读可执行] 是程序的文本段
第2行 [只读]………….不清楚
第3行 [可读可写] 是程序的数据段(包括初始化数据段和未初始化数据段)
第4行 ………………..堆空间
第16行 ………………栈空间
vdso 和 vsyscall ……………系统的快速调用
/proc/342796$ cat smaps
00400000-00401000 r-xp 00000000 fc:50 102760452 /work/oppo_W9050814/memory/memory-analyze/a.out:第1行 [可读可执行] 是程序的文本段
Size: 4 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 4 kB
Pss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 4 kB
Private_Dirty: 0 kB
Referenced: 4 kB
Anonymous: 0 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
ProtectionKey: 0
VmFlags: rd ex mr mw me dw sd
00600000-00601000 r--p 00000000 fc:50 102760452 /work/oppo_W9050814/memory/memory-analyze/a.out
……………………………………
00601000-00602000 rw-p 00001000 fc:50 102760452 /work/oppo_W9050814/memory/memory-analyze/a.out:第3行 [可读可写] 是程序的数据段(包括初始化数据段和未初始化数据段)
……………………………………
0171f000-01740000 rw-p 00000000 00:00 0 [heap]堆空间
Size: 132 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 4 kB
Pss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 4 kB
Referenced: 4 kB
Anonymous: 4 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
ProtectionKey: 0
VmFlags: rd wr mr mw me ac sd
7fecd686f000-7fecd6974000 rw-p 00000000 00:00 0
Size: 1044 kB //malloc(1024*1024)分配的1024K在这个堆上,p1的地址=0x7fecd686f010
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 20 kB
Pss: 20 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 20 kB
Referenced: 20 kB
Anonymous: 20 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
ProtectionKey: 0
VmFlags: rd wr mr mw me ac sd
7fb51c000000-7fb51c221000 rw-p 00000000 00:00 0
Size: 2180 kB //malloc(2*1024*1024)分配的2028K在这个堆上,p1的地址=0x7fb51c0008c0
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 8 kB
Pss: 8 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 8 kB
Referenced: 8 kB
Anonymous: 8 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
ProtectionKey: 0
VmFlags: rd wr mr mw me nr sd 7ff5a030f000-7ff5a0310000 ---p 00000000 00:00 0
……………………………………
7ff5a0310000-7ff5a0b10000 rw-p 00000000 00:00 0
……………………………………
7ff5a0b10000-7ff5a0b11000 ---p 00000000 00:00 0
……………………………………
7ff5a0b11000-7ff5a1311000 rw-p 00000000 00:00 0
……………………………………
7ff5a1311000-7ff5a14d1000 r-xp 00000000 fc:01 2241518 /lib/x86_64-linux-gnu/libc-2.23.so
……………………………………
7ff5a14d1000-7ff5a16d1000 ---p 001c0000 fc:01 2241518 /lib/x86_64-linux-gnu/libc-2.23.so
……………………………………
7ff5a16d1000-7ff5a16d5000 r--p 001c0000 fc:01 2241518 /lib/x86_64-linux-gnu/libc-2.23.so
……………………………………
7ff5a16d5000-7ff5a16d7000 rw-p 001c4000 fc:01 2241518 /lib/x86_64-linux-gnu/libc-2.23.so
……………………………………
7ff5a16d7000-7ff5a16db000 rw-p 00000000 00:00 0
……………………………………
7ff5a16db000-7ff5a16f3000 r-xp 00000000 fc:01 2241500 /lib/x86_64-linux-gnu/libpthread-2.23.so
……………………………………
7ff5a16f3000-7ff5a18f2000 ---p 00018000 fc:01 2241500 /lib/x86_64-linux-gnu/libpthread-2.23.so
……………………………………
7ff5a18f2000-7ff5a18f3000 r--p 00017000 fc:01 2241500 /lib/x86_64-linux-gnu/libpthread-2.23.so
……………………………………
7ff5a18f3000-7ff5a18f4000 rw-p 00018000 fc:01 2241500 /lib/x86_64-linux-gnu/libpthread-2.23.so
……………………………………
7ff5a18f4000-7ff5a18f8000 rw-p 00000000 00:00 0
……………………………………
7ff5a18f8000-7ff5a191e000 r-xp 00000000 fc:01 2241510 /lib/x86_64-linux-gnu/ld-2.23.so
……………………………………
7ff5a1afe000-7ff5a1b02000 rw-p 00000000 00:00 0
……………………………………
7ff5a1b1d000-7ff5a1b1e000 r--p 00025000 fc:01 2241510 /lib/x86_64-linux-gnu/ld-2.23.so
……………………………………
7ff5a1b1e000-7ff5a1b1f000 rw-p 00026000 fc:01 2241510 /lib/x86_64-linux-gnu/ld-2.23.so
……………………………………
7ff5a1b1f000-7ff5a1b20000 rw-p 00000000 00:00 0
……………………………………
7fffaa6a7000-7fffaa6c8000 rw-p 00000000 00:00 0 [stack]栈空间
Size: 132 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 12 kB
Pss: 12 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 12 kB
Referenced: 12 kB
Anonymous: 12 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
ProtectionKey: 0
VmFlags: rd wr mr mw me gd ac
7fffaa7bd000-7fffaa7c0000 r--p 00000000 00:00 0 [vvar]
……………………………………
7fffaa7c0000-7fffaa7c2000 r-xp 00000000 00:00 0 [vdso]
……………………………………
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
……………………………………
关注memory-layout.cpp中红色部分:malloc分配的1M和2M内存空间清晰的分布如下:
$ cat /proc/1101/smaps
00400000-00401000 r-xp 00000000 fc:50 102760452 memory-analyze/a.out:第1行 [可读可执行] 是程序的文本段,下面是不同内存字段大小,后面单独介绍。
Size: 4 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 4 kB
Pss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 4 kB
Private_Dirty: 0 kB
Referenced: 4 kB
Anonymous: 0 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
ProtectionKey: 0
VmFlags: rd ex mr mw me dw sd
00600000-00601000 r--p 00000000 fc:50 102760452 /work/oppo_W9050814/memory/memory-analyze/a.out
……………………………………
00601000-00602000 rw-p 00001000 fc:50 102760452
memory-analyze/a.out:第3行 [可读可写] 是程序的数据段(包括初始化数据段和未初始化数据段)
……………………………………
0171f000-01740000 rw-p 00000000 00:00 0 [heap]堆空间
Size: 132 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 4 kB
Pss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 4 kB
Referenced: 4 kB
Anonymous: 4 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
ProtectionKey: 0
VmFlags: rd wr mr mw me ac sd
7fecd686f000-7fecd6974000 rw-p 00000000 00:00 0
Size: 1044 kB //malloc(1024*1024)分配的1024K在这个堆上,p1的地址=0x7fecd686f010。0x7fecd6974000-0x7fecd686f000=0x105000=1069056=1069056/1024=1044 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 20 kB
Pss: 20 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 20 kB
Referenced: 20 kB
Anonymous: 20 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
ProtectionKey: 0
VmFlags: rd wr mr mw me ac sd
7fb51c000000-7fb51c221000 rw-p 00000000 00:00 0
Size: 2180 kB //malloc(2*1024*1024)分配的2028K在这个堆上,p1的地址=0x7fb51c0008c0
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 8 kB
Pss: 8 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 8 kB
Referenced: 8 kB
Anonymous: 8 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
ProtectionKey: 0
VmFlags: rd wr mr mw me nr sd
7ff5a030f000-7ff5a0310000 ---p 00000000 00:00 0
……………………………………
7ff5a0310000-7ff5a0b10000 rw-p 00000000 00:00 0
……………………………………
7ff5a0b10000-7ff5a0b11000 ---p 00000000 00:00 0
……………………………………
7ff5a0b11000-7ff5a1311000 rw-p 00000000 00:00 0
……………………………………
7ff5a1311000-7ff5a14d1000 r-xp 00000000 fc:01 2241518 /lib/x86_64-linux-gnu/libc-2.23.so
……………………………………
7ff5a14d1000-7ff5a16d1000 ---p 001c0000 fc:01 2241518 /lib/x86_64-linux-gnu/libc-2.23.so
……………………………………
7ff5a16d1000-7ff5a16d5000 r--p 001c0000 fc:01 2241518 /lib/x86_64-linux-gnu/libc-2.23.so
……………………………………
7ff5a16d5000-7ff5a16d7000 rw-p 001c4000 fc:01 2241518 /lib/x86_64-linux-gnu/libc-2.23.so
……………………………………
7ff5a16d7000-7ff5a16db000 rw-p 00000000 00:00 0
……………………………………
7ff5a16db000-7ff5a16f3000 r-xp 00000000 fc:01 2241500 /lib/x86_64-linux-gnu/libpthread-2.23.so
……………………………………
7ff5a16f3000-7ff5a18f2000 ---p 00018000 fc:01 2241500 /lib/x86_64-linux-gnu/libpthread-2.23.so
……………………………………
7ff5a18f2000-7ff5a18f3000 r--p 00017000 fc:01 2241500 /lib/x86_64-linux-gnu/libpthread-2.23.so
……………………………………
7ff5a18f3000-7ff5a18f4000 rw-p 00018000 fc:01 2241500 /lib/x86_64-linux-gnu/libpthread-2.23.so
……………………………………
7ff5a18f4000-7ff5a18f8000 rw-p 00000000 00:00 0
……………………………………
7ff5a18f8000-7ff5a191e000 r-xp 00000000 fc:01 2241510 /lib/x86_64-linux-gnu/ld-2.23.so
……………………………………
7ff5a1afe000-7ff5a1b02000 rw-p 00000000 00:00 0
……………………………………
7ff5a1b1d000-7ff5a1b1e000 r--p 00025000 fc:01 2241510 /lib/x86_64-linux-gnu/ld-2.23.so
……………………………………
7ff5a1b1e000-7ff5a1b1f000 rw-p 00026000 fc:01 2241510 /lib/x86_64-linux-gnu/ld-2.23.so
……………………………………
7ff5a1b1f000-7ff5a1b20000 rw-p 00000000 00:00 0
……………………………………
7fffaa6a7000-7fffaa6c8000 rw-p 00000000 00:00 0 [stack]栈空间
Size: 132 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 12 kB
Pss: 12 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 12 kB
Referenced: 12 kB
Anonymous: 12 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
ProtectionKey: 0
VmFlags: rd wr mr mw me gd ac
7fffaa7bd000-7fffaa7c0000 r--p 00000000 00:00 0 [vvar]
……………………………………
7fffaa7c0000-7fffaa7c2000 r-xp 00000000 00:00 0 [vdso]
……………………………………
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
……………………………………
能不能更直观点呢:参考:
PS: 下一篇我们介绍:进程内存分布--之pmap呈现memory-layout.cpp内存分布
关注我,后续还有更多专题博文分享,谢谢!!!