今天看书看到一句话:Serious user application programs nowadays can easily run from 50 to 200MB and more.意思是说现在的程序轻易的就可以占用50到200MB的内存。然后有点好奇,程序在内存中是什么样子呢?除了必要的代码和堆栈还有什么呢?
下面是自己的一些尝试。
首先是top命令
top -p 1
其中,VIRT是进程1虚拟内存(VIRT)的大小(实际需要的内存容量?),为48428KB(约50MB),实际占用的内存(RES, resident的缩写)为5612KB(约5MB),共享内存(SHR)为3720KB(约3MB)。
然后再看一下ps命令
ps -u -p 1
这个不用说了,没显示共享内存,但虚拟内存与实际内存与top中都是一致的。
还有一个专门看内存命令的pmap
pmap -d 1
1: /usr/lib/systemd/systemd --switched-root --system --deserialize 23
Address Kbytes Mode Offset Device Mapping
00007fb4e5788000 44 r-x-- 0000000000000000 0fd:00000 libnss_files-2.18.so
00007fb4e5793000 2044 ----- 000000000000b000 0fd:00000 libnss_files-2.18.so
00007fb4e5992000 4 r---- 000000000000a000 0fd:00000 libnss_files-2.18.so
00007fb4e5993000 4 rw--- 000000000000b000 0fd:00000 libnss_files-2.18.so
00007fb4e5998000 84 r-x-- 0000000000000000 0fd:00000 libz.so.1.2.8
00007fb4e59ad000 2044 ----- 0000000000015000 0fd:00000 libz.so.1.2.8
...
00007fb4e9cec000 900 rw--- 0000000000000000 000:00000 [ anon ]
00007fffef17f000 132 rw--- 0000000000000000 000:00000 [ stack ]
00007fffef200000 8 r---- 0000000000000000 000:00000 [ anon ]
00007fffef202000 8 r-x-- 0000000000000000 000:00000 [ anon ]
ffffffffff600000 4 r-x-- 0000000000000000 000:00000 [ anon ]
mapped: 48428K writeable/private: 2580K shared: 0K
这个mapped依然与之前的命令一致(但把所有数值加起来的结果是48316KB),但实际占有的内存(2580K)和共享内存(0KB),这个貌似就不对了,因为lib*.so通常为多个进程共享的数据,它们占有的内存即可视为共享内存,从上述结果来看共享内存显然不为0。由此可见这个命令貌似查的不准。据说改命令来自sun os,是不是还有点水土不服?