热门标签 | 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.  
推荐阅读
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • 对于许多初学者而言,遇到总线错误(bus error)或段错误(segmentation fault/core dump)是极其令人困扰的。本文详细探讨了这两种错误的成因、表现形式及解决方法,并提供了实用的调试技巧。 ... [详细]
  • 本文详细介绍了如何解压并安装MySQL集群压缩包,创建用户和组,初始化数据库,配置环境变量,并启动相关服务。此外,还提供了详细的命令行操作步骤和常见问题的解决方案。 ... [详细]
  • CentOS 7.6环境下Prometheus与Grafana的集成部署指南
    本文旨在提供一套详细的步骤,指导读者如何在CentOS 7.6操作系统上成功安装和配置Prometheus 2.17.1及Grafana 6.7.2-1,实现高效的数据监控与可视化。 ... [详细]
  • 本文详细介绍了SDCMS中的全局标签和循环标签。全局标签是在任何模板页面中均可调用的标签,而循环标签用于数据查询和展示。文章解释了这些标签的功能、使用方法及参数配置。 ... [详细]
  • MySQL InnoDB Double Write机制详解
    本文深入探讨了MySQL InnoDB存储引擎的Double Write技术,该技术通过在内存和磁盘上创建数据页的副本,确保了部分写失效(Partial Page Write)情况下的数据完整性和可靠性。同时,文章介绍了InnoDB以页为单位进行读取和更新的机制,并详细解析了Double Write的工作原理。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 本文详细介绍了如何在Linux系统中创建和管理DB2数据库,包括用户切换、数据库创建、错误处理、连接与断开、表空间和缓冲池的创建,以及用户权限管理和数据导入导出等操作。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
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社区 版权所有