Linux
    
    
     释放内存的命令:
    
    
    
     sync
     
     echo 1 > /proc/sys/vm/drop_caches
     drop_caches
    
    
     的值可以是
    
    
     0-3
    
    
     之间的数字,代表不同的含义:
    
    
    
     0
    
    
     :不释放(系统默认值)
    
    
    
     1
    
    
     :释放页缓存
    
    
    
     2
    
    
     :释放
    
    
     dentries
    
    
     和
    
    
     inodes
     
     3
    
    
     :释放所有缓存
    
    
     释放完内存后改回去让系统重新自动分配内存。
    
    
    
     echo 0 >/proc/sys/vm/drop_caches
     free -m #
    
    
     看内存是否已经释放掉了。
    
    
     如果我们需要释放所有缓存,就输入下面的命令:
    
    
    
     echo 3 > /proc/sys/vm/drop_caches
     ######### Linux
    
    
     释放内存的相关知识
    
    
     ###############
    
    
     在
    
    
     Linux
    
    
     系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好。但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用
    
    
     SWAP
    
    
     空
    
    
    
    
     间影响性能,例如当你在
    
    
     linux
    
    
     下频繁存取文件后
    
    
     ,
    
    
     物理内存会很快被用光
    
    
     ,
    
    
     当程序结束后
    
    
     ,
    
    
     内存不会被正常释放
    
    
     ,
    
    
     而是一直作为
    
    
     caching
    
    
     。,此时就需
    
    
    
    
     要执行释放内存(清理缓存)的操作了。
    
    
     Linux
    
    
     系统的缓存机制是相当先进的,他会针对
    
    
     dentry
    
    
     (用于
    
    
     VFS
    
    
     ,加速文件路径名到
    
    
     inode
    
    
     的转换)、
    
    
     Buffer Cache
    
    
     (针对磁盘块的读写)和
    
    
     Page Cache
    
    
     (针对文件
    
    
     inode
    
    
     的读写)进行缓存操作。但是在进行了大量文件操作之后,缓存会把内存资源基本用光。但实际上我们文件操作已经完成,这部分
    
    
    
    
     缓存已经用不到了。这个时候,我们难道只能眼睁睁的看着缓存把内存空间占据掉吗?所以,我们还是有必要来手动进行
    
    
     Linux
    
    
     下释放内存的操作,其实也就是
    
    
    
    
     释放缓存的操作了。
    
    
     /proc
    
    
     是一个虚拟文件系统
    
    
     ,
    
    
     我们可以通过对它的读写操作做为与
    
    
     kernel
    
    
     实体间进行通信的一种手段
    
    
     .
    
    
     也就是说可以通过修改
    
    
     /proc
    
    
     中的文件
    
    
     ,
    
    
     来对当前
    
    
     kernel
    
    
     的行为做出调整
    
    
     .
    
    
     那么我们可以通过调整
    
    
     /proc/sys/vm/drop_caches
    
    
     来释放内存。要达到释
    
    
    
    
     放缓存的目的,我们首先需要了解下关键的配置文件
    
    
     /proc/sys/vm/drop_caches
    
    
     。这个文件中记录了缓存释放的参数,默认值为
    
    
     0
    
    
     ,也就
    
    
    
    
     是不释放缓存。
    
    
     一般复制了文件后
    
    
     ,
    
    
     可用内存会变少,都被
    
    
     cached
    
    
     占用了,这是
    
    
     linux
    
    
     为了提高文件读取效率的做法:为了提高磁盘存取效率
    
    
     , Linux
    
    
     做了一些精心的设计
    
    
     ,
    
    
     除了对
    
    
     dentry
    
    
     进行缓存
    
    
     (
    
    
     用于
    
    
     VFS,
    
    
     加速文件路径名到
    
    
     inode
    
    
     的转换
    
    
     ),
    
    
     还采取了两种主要
    
    
     Cache
    
    
     方式:
    
    
     Buffer Cache
    
    
     和
    
    
     Page Cache
    
    
     。前者针对磁盘块的读写,后者针对文件
    
    
     inode
    
    
     的读写。这些
    
    
     Cache
    
    
     有效缩短了
    
    
     I/O
    
    
     系统调用
    
    
     (
    
    
     比如
    
    
     read,write,getdents)
    
    
     的时间。
    
    
     ”
    
    
     释放内存前先使用
    
    
     sync
    
    
     命令做同步,以确保文件系统的完整性,将所有未写的系统缓冲区写到磁盘中,包含已修改的
    
    
     i-node
    
    
     、已延迟的块
    
    
     I/O
    
    
     和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。
    
    
     [root@fcbu.com ~]# free -m
    
    
    
    
    
     total
    
    
    
    
     used
    
    
    
    
     free
    
    
    
    
     shared
    
    
    
    
     buffers
    
    
    
    
     cached
     
     Mem:
    
    
    
    
     7979
    
    
    
    
     7897
    
    
    
    
     82
    
    
    
    
     0
    
    
    
    
     30
    
    
    
    
     3918
     
     -/ buffers/cache:
    
    
    
    
     3948       4031
     
     Swap:         4996        438       4558
    
    
     第一行用全局角度描述系统使用的内存状况:
    
    
    
     total
    
    
     内存总数
    
    
    
     used
    
    
     已经使用的内存数,一般情况这个值会比较大,因为这个值包括了
    
    
     cache
    
    
     应用程序使用的内存
    
    
    
     free
    
    
     空闲的内存数
    
    
    
     shared
    
    
     多个进程共享的内存总额
    
    
    
     buffers
    
    
     缓存,主要用于目录方面
    
    
     ,inode
    
    
     值等(
    
    
     ls
    
    
     大目录可看到这个值增加)
    
    
    
     cached
    
    
     缓存,用于已打开的文件
    
    
     第二行描述应用程序的内存使用:
    
    
    
     -buffers/cache
    
    
     的内存数
    
    
     :used – buffers – cached
     
     buffers/cache
    
    
     的内存数
    
    
     :free buffers cached
    
    
    
     前个值表示
    
    
     -buffers/cache
    
    
     应用程序使用的内存大小,
    
    
     used
    
    
     减去缓存值
    
    
    
     后个值表示
    
    
     buffers/cache
    
    
     所有可供应用程序使用的内存大小,
    
    
     free
    
    
     加上缓存值
    
    
     第三行表示
    
    
     swap
    
    
     的使用:
    
    
    
     used
    
    
     已使用
    
    
    
     free
    
    
     未使用
    
    
    
    
     可用的内存
    
    
     =free memory buffers cached
    
    
     。
    
    
     为什么
    
    
     free
    
    
     这么小,是否关闭应用后内存没有释放?
    
    
    
     但实际上,我们都知道这是因为
    
    
     Linux
    
    
     对内存的管理与
    
    
     Windows
    
    
     不同,
    
    
     free
    
    
     小并不是说内存不够用了,应该看的是
    
    
     free
    
    
     的第二行最后一个值:
    
    
     -/ buffers/cache:
    
    
    
    
     3948
    
    
    
    
     4031
    
    
    
    
     ,这才是系统可用的内存大小。
    
   
    
     实际项目中的经验告诉我们,如果因为是应用有像内存泄露、溢出的问题,从
    
    
     swap
    
    
     的使用情况是可以比较快速可以判断的,但
    
    
     free
    
    
     上面反而比较难查看。我觉得既然核心是可以快速清空
    
    
     buffer
    
    
     或
    
    
     cache
    
    
     ,但核心并没有这样做(默认值是
    
    
     0
    
    
     ),我们不应该随便去改变它。
    
   
    
     一般情况下,应用在系统上稳定运行了,
    
    
     free
    
    
     值也会保持在一个稳定值的,虽然看上去可能比较小。当发生内存不足、应用获取不到可用内存、
    
    
     OOM
    
    
     错
    
    
    
    
     误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应用内存溢出等情况,否则,清空
    
    
     buffer
    
    
     ,强制腾出
    
    
     free
    
    
     的大小,可
    
    
    
    
     能只是把问题给暂时屏蔽了,所以说一般情况下
    
    
     linux都不用经常手动释放内存。
    
   
    
     向/proc/sys/vm/drop_caches中写入内容,会清理缓存。
     
      建议先执行sync
     
     (sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)。执行echo 1、2、3 至 /proc/sys/vm/drop_caches, 达到不同的清理目的。
    
   
 
