写服务端程序,对这几个值深入认识很重要,网上也有很多帖子讲这个概念的,但是大多都是出自几个作者的名下的 转载. 说的也比较笼统, 比如RES=DATA+CODE 但是很多实际情况并不是这样.
从下面的程序来分析这个值的真正含义.
1 | int main( void ) { |
2 |
3 | while (1) { |
4 | ; |
5 | } |
6 | return 0; |
7 |
8 | } |
运行这个程序后来看看这几个值情况:
VIRT 是这个进程最大能够占用的内存空间,是个额定值,虚拟的!
RES 为进程占用的实际内存的大小, 也就是在内存条中占用的大小(物理内存),当然不包含被置换的大小
%MEM 是进程占用的物理内存的百分比
SHR 是共享内存大小, 也是额定的 表示这个程序可能被其它程序共享到的大小
CODE 进程的代码段在实际内存中占用的空间大小
DATA 是程序运行时需要使用的数据空间(数据+栈),
SWAP 是交换分区的大小,被置换的!
.. 从上面的图可以得出
VIRT(4000) = RES(280) + SWAP(3720)
但是
RES(280) != CODE(4) + DATA(188)
这是为什么呢? 试试下面这段代码:
1 | #include <stdio.h> |
2 | int main( int argc, const char *argv[]) |
3 | { |
4 | char * a = ( char *) malloc (104857600); |
5 | /*memset(a, 0, 104857600);*/ |
6 | while (1) ; |
7 | return 0; |
8 | } |
实验发现:
data也是额定的 也就是说 当你malloc时就会显示的大小 ,而RES值不会进行变化, 但是当向malloc的这段内存中进行 memset 或者写数据时 RES 才会趋向于 data+code
1 | top -p 1309, 1882 查看某一进程 |
c 显示全路径
W 写入配置文件
Usage of Top Command: http://www.thegeekstuff.com/2010/01/15-practical-unix-linux-top-command-examples/
free命令可以查看内存占用情况, 可以 使用-k , -m , -g 分别表示以KB, MB, GB显示
比如按照MB显示内存数据:
这台电脑是虚拟机, 内存比较少, 只有1G多点, 从显示的列表来详细说下:
total表示总共内存, used表示使用了多少内存, free表示还有多少内存没被使用, shared表示多个进程共享的内存大小
其中buffers和cached表示磁盘缓冲大小,buffers表示OS用于缓冲写到磁盘的数据, cached表示OS缓冲从磁盘读出来的数据 , 两者都是由OS管理的.
另外与之相应的是
-/+ buffers/cache: 是从一个进程的角度去看的系统的内存占用情况, 其中used表示OS使用了多少内存, free表示OS还有多少内存没有被使用(是从一个进程角度去看的), 和OS角度不同,OS认为已经使用了126M, 还有875M没有使用. 但是从进程角度看buffers/cached是为了提高I/O性能的, 当进程需要使用内存的时候,这块内存是可以很快被回收的. 所以从进程角度看可用内存=OS(free) + buffers + cached
swap为交换分区大小, 一般used为0, 但是OS调度策略是和swappiness大小相关的, 默认值为60, 它的意思是若OS要使用内存, 有60%的概率使用swap, 所以有时候内存还有空间但是OS会用swap大小比如下面这张情况:
所以若尽可能的使用内存可以降低swappiness大小,可通过修改/etc/sysctl.conf文件, 在之后追加一行vm.swappiness=10
若机器不能重启的话, 可以通过
sysctl -w vm.swappiness=10 这个命令来临时修改.