使用过linux的同学,应该都用过top这个命令,使用这个命令,我们可以动态的查看系统中资源的使用情况
其中有有几个与内存相关的值,值得我们注意
– VIRT RES SHR
(腾讯一面我被问到了这个问题,top里面的这三个字段代表什么意思,我当时不知道,好吧我平时使用top都是只看百分比的,哭了)
好的,那么top中的这三个字段到底代表什么意思呢,百度一下,你就知道
– VIRT 虚拟内存
– RES 驻留内存
– SHR 共享内存
这几个内存到底代表什么含义呢,为什么一个进程的内存占用要弄的这么复杂呢?
这就涉及到linux的内存管理机制了,关于linux的内存管理,我们后面详谈,这里,我们先解决这三个内存含义吧
虚拟内存(VIRT)
– 进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
– 假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量
驻留内存(res)
– 进程当前使用的内存大小,但不包括swap out
– 包含其他进程的共享
– 如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
– 关于库占用内存的情况,它只统计加载的库文件所占内存大小
共享内存(shr)
– 除了自身进程的共享内存,也包括其他进程的共享内存
– 虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
– 计算某个进程所占的物理内存大小公式:RES – SHR
– swap out后,它将会降下来
有一个典型的例子,当我们执行以下两行代码
cpp
int *p=(int*)malloc(sizeof(int)*1000);
memset(p,0,sizeof(p));
当我们执行这两条指令之后,上面的三种内存会怎么改变呢,首先,我们要知道linux里面的内存管理策略是,你要多少,我们分配给你多少,单别高兴的太早,我给你的内存是虚拟地址空间里面的,如果你不用到它,操作系统就不会虚拟地址映射到物理地址上面,所以当执行malloc之后,虚拟内存会变大,单驻留内存不会变,在执行memset之后,访问内存时产生了却也终端,操作系统将分配的虚拟地址映射到物理地址之上,这时,进程实际使用了这段内存,自然,驻留内存就增加了,当然,这一点内存不是共享的,所以共享内存自然不会增加。
除了上述的三个字段之外,还有一个data字段,表明的是数据占用的内存。如果top没有显示,按f键可以显示出来。这一块是真正的该程序要求的数据空间,是真正在运行中要使用的。