关于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 @   Linux大魔王  阅读(546)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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设置自定义快捷键
点击右上角即可分享
微信分享提示