free命令是查看内存使用情况的利器。 free命令的语法相对来说是比较简单的,如下:
usage: free [-b|-k|-m|-g] [-l] [-o] [-t] [-s delay] [-c count] [-V]
-b,-k,-m,-g show output in bytes, KB, MB, or GB
-l show detailed low and high memory statistics
-o use old format (no -/+buffers/cache line)
-t display total for RAM + swap
-s update every [delay] seconds
-c update [count] times
-V display version information and exit
这个都比较容易理解,简单的翻译一下。
- -b -k -m -g 这是表示显示内存的单位,分别以字节、KB、MB及GB来显示。
- -l,因为在Linux系统中内存中有低区和高区之分,内核能够直接寻址的区域太小,好像是只有896M(在32位机器上),其它的都是高区域内存。如果指定-l选项,可以显示Low和High Region的内存总量。
- -o,不显示buffers和Cache信息。
- -s和-c ,可以让free命令一直运行,-s表示多长时间更新一次free命令的输出信息。-c选项表示一共输出多少次。
看一个具体的输出如下:
total used free shared buffers cached
Mem: 32797280 32578864 218416 0 112644 20436872
-/+ buffers/cache: 12029348 20767932
Swap: 33554424 1356 33553068
一,内存(交换区)使用信息
上面输出的第一行的信息如下:
- (total)表示物理内存(交换区)的总量。
- (used)已经使用的内存(交换区)总量。
- (free)空闲的物理内存(交换区)总量。
- (shared)共享的物理内存总量。
- (buffers)系统已经分配但没有被使用的缓冲区总量。表示当前空闲
- (cached)系统已经分配但没有被使用的缓存总量。表示当前空闲
二,缓冲和缓存数据信息
- (used),实际使用的buffers/cache的总量。
- (free),当前系统还没有被使用的buffers/cache 和 未被分配的内存之和,一般来说,这就是当前系统还可以使用的内存总量。
三,系统分配了哪些内存
上面看到物理内存的使用是 32578864,那么这些内存是给谁使用了?
根据上面的解释,那么系统当前已经分配的内存应该是这几个部分:buffers/cache的已经使用部分、内存的buffers和内存的cached(因为这是已经分配了的,只是没被使用)。
也就是说,下面这个式子是成立的:
(Mem).used = (-/+ buffers/cache).used+ (Mem).buffers + (Mem).cached 。
32578864 =12029348 + 112644 + 20436872//上面的输出数据替换之后
另外还可以发现 下面的数据是成立的:
(Mem).total = (buffers/cache).used + (buffers/cache).free 。
为什么会是这种情况,这不相当于所有的内存都是buffers或者cache,答案:是的。这和Linux的内存分配机制有关系。
在linux的内存分配机制中,如果有物理内存的话,都会全部优先使用,只有物理内存还有空闲,就绝对不会释放已经被分配的内存。哪怕是分配这个内存的进程已经不存在了,也不会释放这个进程所申请的内存。将所有这些内存都用作系统缓存。这样的话,就不需要经常向内核申请内存了,使得一方面内存分配效率提高,二方面(有时)分利于数据的读取。