关于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、开源等技术
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
2019-12-10 Linux Mint设置自定义快捷键