以下是笔者在虚拟机上运行的debian系统的free情况。该虚拟机内存只有128M,同时分配了256M的SWAP交换区。
total used free shared buffers cached Mem: 124788 113432 11356 0 15308 75568 -/+ buffers/cache: 22556 102232 Swap: 245752 20 245732
第一行 (可以理解为从操作系统的角度来看内存分配)
total | 总物理内存大小。 |
used | 已分配的大小,注意,对操作系统来说任何被使用的内存都是used |
free | 未被分配的物理内存大小。 |
shared | 共享内存大小,主要用于进程间通信,例如Oracle会使用上GB的共享内存。 |
buffers | 主要用于块设备数据缓冲,例如记录文件系统的metadata(目录、权限等等信息) |
cached | 主要用于文件内容缓冲 |
# 文件系统实际上可以粗略的划分为两个部分:
# (1)metadata:即通常说的元数据,包括目录结构、文件的名字、大小、修改时间、权限等等信息。
# (2)filedata:即文件中真正存储的内容
# "缓存"实际上就是在内存中划分一块区域作为硬盘和进程之间的缓冲区域,写进程把数据写到这里然后就干其他事情去了,读进程需要时先在这里找,找不到再去找硬盘,这样就大大提高了读写效率,同时缩短了IO等待时间,否则你在linux上运行man iptables 这样的命令的时候每次都会等N久。。
第二行 (可以理解为从应用程序的角度来看内存分配)
total used free shared buffers cached Mem: 124788 113432 11356 0 15308 75568 -/+ buffers/cache: 22556 102232 Swap: 245752 20 245732
- buffers/cached | = used(第一行) - buffers - cached | 实际上是程序当前"真实使用"的"物理内存"的大小。 |
+buffers/cached | = buffers + cached | 两个加起来可以理解为"暂时借给"系统作为"缓冲区"使用的内存大小。 |
从应用多角度来说,实际上系统还可以分配给他的内存有这么多:11356(free) + 15308(buffers) + 75568(cached)= 102232(free)
而系统所拥有的总的物理内存大小 113432 = 22556( - buffers/cached) + 102232 (+ buffers/cached)
那什么时候系统会开始回收buffers和cached部分的内存呢?
这里要看一下数据:
root@debian01:~# cat /proc/meminfo MemTotal: 124788 kB MemFree: 11596 kB Buffers: 15332 kB Cached: 75568 kB SwapCached: 20 kB Active: 54884 kB Inactive: 45564 kB Active(anon): 2124 kB Inactive(anon): 7560 kB Active(file): 52760 kB Inactive(file): 38004 kB Unevictable: 0 kB Mlocked: 0 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 124788 kB LowFree: 11596 kB SwapTotal: 245752 kB SwapFree: 245732 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 9544 kB Mapped: 5884 kB Shmem: 136 kB Slab: 8784 kB SReclaimable: 4940 kB SUnreclaim: 3844 kB KernelStack: 528 kB PageTables: 456 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 308144 kB Committed_AS: 43272 kB VmallocTotal: 897016 kB VmallocUsed: 6344 kB VmallocChunk: 879908 kB HardwareCorrupted: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 4096 kB DirectMap4k: 16384 kB DirectMap4M: 114688 kB
meminfo的数据比较多,这里就不细讲了,我们只关注一个数据。
LowFree: 11596 kB
实际上当free部分的内存小于这个值的时候,系统就会考虑是否需要回收"缓存"部分的物理内存,当然这不是绝对的,这可以作为一个参考阀值。
说了这么多,那么到底有没有办法强制释放呢??
话说办法其实很简单,在控制台执行以下命令即可:
echo 3 > /proc/sys/vm/drop_caches
这里的"3"表示释放所有buffers和cached中能释放的部分。
root@debian01:~# echo 3 > /proc/sys/vm/drop_caches root@debian01:~# free total used free shared buffers cached Mem: 124788 26764 98024 0 148 6144 -/+ buffers/cache: 20472 104316 Swap: 245752 20 245732
手工释放以后大家可以测试一下,运行几次类似以下这些命令,会明显发现又涨上去了。。。
ls -la /dev/ find / -name *.sh man iptables root@debian01:~# free total used free shared buffers cached Mem: 124788 87368 37420 0 30692 25512 -/+ buffers/cache: 31164 93624 Swap: 245752 20 245732
原文:http://my.oschina.net/zhangxc73912/blog/528379