关于Linux内存回收简单理解

Linux释放内存的相关知识

在Linux下一般不需要去释放内存,因为系统已将内存管理的很好。但也有例外,有时内存会被缓存占用掉,导致系统使用SWAP空间影响性能,如当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。此时就需要执行释放内存(清理缓存)的操作。

Linux系统的缓存机制是相当先进的,他会针对dentry(用于VFS,加速文件路径名到inode的转换)、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作。但在进行了大量文件操作之后,缓存会把内存资源基本用光。实际上文件操作已完成,这部分缓存已用不到了。这时,有必要来手动进行Linux下释放内存的操作,其实是释放缓存的操作。

/proc是一个虚拟文件系统,我们可通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可通过修改/proc中的文件,来对当前kernel的行为做出调整.那么可通过调整/proc/sys/vm/drop_caches来释放内存。该文件中记录了缓存释放的参数(默认值为0,也就是不释放缓存)
0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存


一般复制了文件后,可用内存会变少,都被cached占用了,这是linux为了提高文件读取效率的做法:
  为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。

释放内存前先使用sync命令做同步,以确保文件系统的完整性,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中可能会丢失未保存的文件。
[root@localhost ~]# cat 1.sh
#!/bin/bash
step=1
for (( i = 0; i < 60; i = (i+step) )); do
    sync
    sleep $step
done

exit 0


[root@localhost ~]# bash -x 1.sh


# 释放缓存区内存的方法
1)清理pagecache(页面缓存)
# echo 1 > /proc/sys/vm/drop_caches     或 sysctl -w vm.drop_caches=1

2)清理dentries(目录缓存)和inodes
# echo 2 > /proc/sys/vm/drop_caches     或 sysctl -w vm.drop_caches=2

3)清理pagecache、dentries和inodes
# echo 3 > /proc/sys/vm/drop_caches     或 sysctl -w vm.drop_caches=3

注:上面三种方式都是临时释放缓存的方法,要永久释放缓存需在/etc/sysctl.conf文件中配置:vm.drop_caches=1/2/3,然后sysctl -p



# 释放内存
[root@host-172-36-35-13 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:            62G        9.0G        5.3G        3.2G         48G         50G
Swap:           19G        329M         19G

[root@localhost ~]# echo 1>/proc/sys/vm/drop_caches

[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:            62G         10G         48G        3.2G        3.7G         48G
Swap:           19G        324M         19G

释放完内存后改回去让系统重新自动分配内存
[root@localhost ~]# echo 0>/proc/sys/vm/drop_caches

如在改回时发现改不了或不生效的情况,请看 这里

已使用内存计算公式(换成M计算)

[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          64263       13331       46858        3259        4073       47048
Swap:         20479         294       20185


used=(total-free-buffers-cache)
13331=64263-46858-4073

欢迎加入QQ群一起讨论Linux、开源等技术

posted @ 2021-12-10 10:35  Linux大魔王  阅读(563)  评论(0)    收藏  举报