****************************
*linux内存&&free命令详解
****************************
 
-------------------------------
-free -m
-------------------------------
[root@CC ~]# free -m
              total       used      free      shared      buffers      cached
Mem:      249        163        86              0               10              94
-/+ buffers/cache:   58      191
Swap:     511            0      511
 
 
-------------------------------
-解释

-------------------------------
第二行(mem):
total:总计物理内存的大小。
used:已使用多大。
free:可用有多少。
Shared:多个进程共享的内存总额,现在已经不用。
Buffers/cached:磁盘缓存的大小。
第三行

-buffers/cache 的内存数:used - buffers - cached
+buffers/cache 的内存数:free + buffers + cached 

第四行就不多解释了。
 
---------------------------
-
mem与-/+ buffers/cache的used/free的区别
---------------------------
mem是从OS的角度来看,因为对于OS,buffers/cached 都是已经被使用了的,所以free=total-used=86MB,used包含了内核+Apps+buffers+cached

-/+ buffers/cache  从应用程序角度来看,对于应用程序来说,buffers/cached 是未被使用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached能很快地被回收。 所以说,可用内存=total-used( buffers/cache

------------------------------------
-buffers与cached的区别。
------------------------------------
缓存(cached)是把读取过的数据保存起来,重新读取时若命中就不去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。 
 
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即将buffer写入磁盘),也可以通过sync命令手动清空缓冲。卸载移动设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。  
 
总的来说 buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。 
 
cache和buffer是不会自动清除的,我们可以 使用free再来试试,看看是否有释放?
[root@CC ~]# free -m
              total         used       free       shared          buffers        cached
Mem:      249          244           5             0                   8               174
-/+ buffers/cache:     61       188
Swap:      511             0       511
 
似乎没有任何变化。(实际情况下,内存的管理还与Swap有关)
 
******************************
*手动清除缓存
******************************
/proc是一个虚拟文件系统,我们可以通过修改/proc中的文件,来对当前kernel的行为做出调整。那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存(内核版本在 2.6.16之后才可用)
 
 
释放内存前,必须把缓存和缓冲中的数据写入磁盘
[root@CC ~]# sync
 
--------------------------------
-drop_caches的4个值
--------------------------------
默认是0,即不清除缓存
to free pagecache, use echo 1 > /proc/sys/vm/drop_caches;
to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to free pagecache, dentries and inodes, use echo 3 > 
/proc/sys/vm/drop_caches;
(我一般使用3,全部清了,清完之后要改回0哦)
 
 
tips:[转]
上述文章就长期以来很多用户对Linux内存管理方面的疑问,给出了一个比较“直观”的回复,我更觉得有点像是核心开发小组的妥协。 对于是否需要使用这个值,或向用户提及这个值,我是有保留意见的:
 
1、从man可以看到,这值从2.6.16以后的核心版本才提供,也就是老版的操作系统,如RHEL 4.x之前的版本都没有;
2、若对于系统内存是否够用的观察,我还是愿意去看swap的使用率和si/so两个值的大小;
 
--------------------------------------------------------
-为什么free这么小,是否关闭应用后内存没有释放?
--------------------------------------------------------
但实际上,我们都知道这是因为Linux对内存的管理与Windows不同,free小并不是说内存不够用了,应该看的是free的第二行最后一个值, 这才是系统可用的内存大小。
-/+ buffers/cache: 58 191
 
实际项目中告诉我们,如果因为是应用有像内存泄露、溢出的问题,从swap的使用情况是可以比较快速可以判断的,但free上面反而比较难查看。 相反,如果在这个时候,我们告诉用户,修改系统的一个值,“可以”释放内存,free就大了。用户会怎么想?不会觉得操作系统“有问题”吗?
所以说,我觉得既然核心是可以快速清空buffer或cache,也不难做到(这从上面的操作中可以明显看到),但核心并没有这样做(默认值是0),我们就不应该随便去改变它。
 
一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的,虽然看上去可能比较小。 当发生内存不足、应用获取不到可用内存、OOM错误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应用内存溢出等情况,否则,清空buffer,强制腾出free的大小,可能只是把问题给暂时屏蔽了
 
我觉得,排除内存不足的情况外,除非是在软件开发阶段,需要临时清掉buffer,以判断应用的内存使用情况;或应用已经不再提供支持,即使应用对内存的 时候确实有问题,而且无法避免的情况下,才考虑定时清空buffer。