热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux下内存释放问题

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd
细心的朋友会注意到,当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法.那么我来谈谈这个问题.  
先来说说free命令  
[root@server ~]# free -m  
             total       used       free     shared    buffers     cached  
Mem:           249        163         86          0         10         94  
-/+ buffers/cache:         58        191  
Swap:          511          0        511  
其中:  
total 内存总数  
used 已经使用的内存数  
free 空闲的内存数  
shared 多个进程共享的内存总额  
buffers Buffer Cache和cached Page Cache 磁盘缓存的大小  
-buffers/cache 的内存数:used - buffers - cached  
+buffers/cache 的内存数:free + buffers + cached  
可用的memory=free memory+buffers+cached  
有了这个基础后,可以得知,我现在used为163MB,free为86,buffer和cached分别为10,94  
那么我们来看看,如果我执行复制文件,内存会发生什么变化.  
[root@server ~]# cp -r /etc ~/test/  
[root@server ~]# free -m  
             total       used       free     shared    buffers     cached  
Mem:           249        244          4          0          8        174  
-/+ buffers/cache:         62        187  
Swap:          511          0        511  
在我命令执行结束后,used为244MB,free为4MB,buffers为8MB,cached为174MB,天呐都被cached吃掉了.别紧张,这是为了提高文件读取效率的做法.  
"为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。"  
那么有人说过段时间,linux会自动释放掉所用的内存,我们使用free再来试试,看看是否有释放  
[root@server test]# free -m  
             total       used       free     shared    buffers     cached  
Mem:           249        244          5          0          8        174  
-/+ buffers/cache:         61        188  
Swap:          511          0        511  
MS没有任何变化,那么我能否手动释放掉这些内存呢?回答是可以的!  
/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整.那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存.操作如下:  
[root@server test]# cat /proc/sys/vm/drop_caches  
0  
首先,/proc/sys/vm/drop_caches的值,默认为0  
[root@server test]# sync  
手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)  
[root@server test]# echo 3 > /proc/sys/vm/drop_caches  
[root@server test]# cat /proc/sys/vm/drop_caches  
3  
将/proc/sys/vm/drop_caches值设为3  
[root@server test]# free -m  
             total       used       free     shared    buffers     cached  
Mem:           249         66        182          0          0         11  
-/+ buffers/cache:         55        194  
Swap:          511          0        511  
再来运行free命令,发现现在的used为66MB,free为182MB,buffers为0MB,cached为11MB.那么有效的释放了buffer和cache.  
有关/proc/sys/vm/drop_caches的用法在下面进行了说明  
/proc/sys/vm/drop_caches (since Linux 2.6.16)  
              Writing  to  this  file  causes the kernel to drop clean caches,  
              dentries and inodes from memory, causing that memory  to  become
              free.  
              To  free  pagecache,  use  echo 1 > /proc/sys/vm/drop_caches; to  
              free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;  
              to   free   pagecache,   dentries  and  inodes,  use  echo  3  >  
              /proc/sys/vm/drop_caches.  
              Because this is a non-destructive operation  and  dirty  objects  
              are not freeable, the user should run sync(8) first.  
推荐阅读
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 选择适合生产环境的Docker存储驱动
    本文旨在探讨如何在生产环境中选择合适的Docker存储驱动,并详细介绍不同Linux发行版下的配置方法。通过参考官方文档和兼容性矩阵,提供实用的操作指南。 ... [详细]
  • 本文详细介绍了如何在预装Ubuntu系统的笔记本电脑上安装Windows 7。针对没有光驱的情况,提供了通过USB安装的具体方法,并解决了分区、驱动器无法识别等问题。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 本文详细介绍如何使用arm-eabi-gdb调试Android平台上的C/C++程序。通过具体步骤和实用技巧,帮助开发者更高效地进行调试工作。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
author-avatar
生命在于创新_475
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有