1. 程式人生 > >linux /proc下的statm、maps、memmap 內存信息文件分析

linux /proc下的statm、maps、memmap 內存信息文件分析

分配 偏移量 文件路徑 heap atm 代碼段 share 地址 mem

ls /proc 能看到一些數字命名的文件夾,這些數字就是對於進程的pid

[root@localhost proc]# cat /proc/1/statm
487 185 133 31 0 67 0

很簡單地返回7組數字,每一個的單位都是一頁 (常見的是4KB)
分別是
size:任務虛擬地址空間大小
Resident:正在使用的物理內存大小
Shared:共享頁數
Trs:程序所擁有的可執行虛擬內存大小
Lrs:被映像倒任務的虛擬內存空間的庫的大小
Drs:程序數據段和用戶態的棧的大小
dt:臟頁數量


接下來看看maps
[root@localhost proc]# cat /proc/1/maps
00110000-00111000 r-xp 00110000 00:00 0 [vdso]
0032b000-00347000 r-xp 00000000 fd:00 852733 /lib/ld-2.8.so
00347000-00348000 r--p 0001c000 fd:00 852733 /lib/ld-2.8.so
00348000-00349000 rw-p 0001d000 fd:00 852733 /lib/ld-2.8.so
0034b000-004ae000 r-xp 00000000 fd:00 852734 /lib/libc-2.8.so
004ae000-004b0000 r--p 00163000 fd:00 852734 /lib/libc-2.8.so
004b0000-004b1000 rw-p 00165000 fd:00 852734 /lib/libc-2.8.so
004b1000-004b4000 rw-p 004b1000 00:00 0
08048000-08067000 r-xp 00000000 fd:00 843075 /sbin/init
08067000-08068000 rw-p 0001e000 fd:00 843075 /sbin/init
08b42000-08b6a000 rw-p 08b42000 00:00 0 [heap]
b8046000-b8048000 rw-p b8046000 00:00 0
bfb4e000-bfb63000 rw-p bffeb000 00:00 0 [stack]


一共有6列
第一列代表內存段的虛擬地址
第二列代表執行權限,r,w,x不必說,p=私有 s=共享
不用說,heap和stack段不應該有x,否則就容易被xx,不過這個跟具體的版本有關
第三列代表在進程地址裏的偏移量
第四列映射文件的主設備號和次設備號
通過 cat /proc/devices
得知fd是253 device-mapper


第五列映像文件的節點號,即inode


第六列是映像文件的路徑
以前我很奇怪怎麽會有兩個相同的文件路徑,原來
08048000-08067000 r-xp 00000000 fd:00 843075 /sbin/init
08067000-08068000 rw-p 0001e000 fd:00 843075 /sbin/init
一個是只讀的,是代碼段,一個是讀寫的,是數據段
至於為什麽共享庫分成了三個
0034b000-004ae000 r-xp 00000000 fd:00 852734 /lib/libc-2.8.so
004ae000-004b0000 r--p 00163000 fd:00 852734 /lib/libc-2.8.so
004b0000-004b1000 rw-p 00165000 fd:00 852734 /lib/libc-2.8.so
其中的004ae000-004b0000 r--p 00163000 fd:00 852734 /lib/libc-2.8.so
還是不能理解


最後看看神秘的memmap
可惜不是所有的版本都有這個文件,如同我這裏的情況
只有口頭說一說了,memmap需要和maps配合看
顯示出來的每一行代表maps裏的一個段
每一行的每一個數字,代表那個段裏的一個頁,段有多大,一行就有對應的多少個數字


如果這個數字是0,代表系統為其分配了虛擬內存,但是沒有分配物理內存
如果有數字,則代表系統為其分配了物理內存,以及有多少個進程引用了這個頁
當然,不會有負數出現

linux /proc下的statm、maps、memmap 內存信息文件分析