经常使用的查看内存工具备:top,ps,free,/proc/meminfo,/proc/$PID/status等,通常都指定了虚拟内存占用状况,但ps或/proc/$PID/status中RSS或RSZ指定的是实际内存大小。html
root:~# free total used free shared buffers Mem: 123776 71712 52064 0 8036 -/+ buffers: 63676 60100 Swap: 0 0 0
其中第一行用全局角度描述系统使用的内存情况:
total——总物理内存
used——已使用内存,通常状况这个值会比较大,由于这个值包括了cache+应用程序使用的内存
free——彻底未被使用的内存
shared——应用程序共享内存
buffers——缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增长)
cached——缓存,用于已打开的文件,有些系统中包含进buffers
note:
total=used+free
used=buffers+cached (maybe add shared also)node
第二行描述应用程序的内存使用:
前个值表示-buffers/cache——应用程序使用的内存大小,used减去缓存值
后个值表示+buffers/cache——全部可供应用程序使用的内存大小,free加上缓存值
note:
-buffers/cache=used-buffers-cached
+buffers/cache=free+buffers+cachedlinux
第三行表示swap的使用:
used——已使用
free——未使用缓存
Linux系统的缓存机制是至关先进的,他会针对dentry(用于VFS,加速文件路径名到inode的转换)、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操做。可是在进行了大量文件操做以后,缓存会把内存资源基本用光。但实际上咱们文件操做已经完成,这部分缓存已经用不到了。这个时候,咱们难道只能眼睁睁的看着缓存把内存空间占据掉么?工具
因此,咱们仍是有必要来手动进行Linux下释放内存的操做,其实也就是释放缓存的操做了。post
要达到释放缓存的目的,咱们首先须要了解下关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就是不释放缓存。他的值能够为0~3之间的任意数字,表明着不一样的含义:this
0 – 不释放
1 – 释放页缓存
2 – 释放dentries和inodes
3 – 释放全部缓存url
知道了参数后,咱们就能够根据咱们的须要,使用下面的指令来进行操做。spa
首先咱们须要使用sync指令,将全部未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。不然在释放缓存的过程当中,可能会丢失未保存的文件。.net
#sync
接下来,咱们须要将须要的参数写进/proc/sys/vm/drop_caches文件中,好比咱们须要释放全部缓存,就输入下面的命令:
#echo 3 > /proc/sys/vm/drop_caches
此指令输入后会当即生效,能够查询如今的可用内存明显的变多了。
要查询当前缓存释放的参数,能够输入下面的指令:
#cat /proc/sys/vm/drop_caches
linux内核文档对此描述以下:
drop_caches Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free. To free pagecache: echo 1 > /proc/sys/vm/drop_caches To free dentries and inodes: echo 2 > /proc/sys/vm/drop_caches To free pagecache, dentries and inodes: echo 3 > /proc/sys/vm/drop_caches As this is a non-destructive operation and dirty objects are not freeable, the user should run `sync' first.
参考:
2. Linux内存详解