Linux内存释放机制

转载 2012年03月30日 11:17:48

 linux的free命令中,cached和buffers的区别

Free
  free 命令相对于top 提供了更简洁的查看系统内存使用情况:
  $ free
  total used free shared buffers cachedMem: 255268 238332 16936 0 85540 126384-/+ buffers/cache: 26408 228860Swap: 265000 0 265000
  Mem:表示物理内存统计
  -/+ buffers/cached:表示物理内存的缓存统计
  Swap:表示硬盘上交换分区的使用情况,这里我们不去关心。
  系统的总物理内存:255268Kb(256M),但系统当前真正可用的内存b并不是第一行free 标记的 16936Kb,它仅代表未被分配的内存。
  我们使用total1、used1、free1、used2、free2 等名称来代表上面统计数据的各值,1、2 分别代表第一行和第二行的数据。
  total1:表示物理内存总量。
  used1:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
  free1:未被分配的内存。
  shared1:共享内存,一般系统不会用到,这里也不讨论。
  buffers1:系统分配但未被使用的buffers 数量。
  cached1:系统分配但未被使用的cache 数量。buffer 与cache 的区别见后面。
  used2:实际使用的buffers 与cache 总量,也是实际使用的内存总量。
  free2:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。
  可以整理出如下等式:
  total1 = used1 + free1total1 = used2 + free2used1 = buffers1 + cached1 + used2free2 = buffers1 + cached1 + free1
  buffer 与cache 的区别
  A buffer is something that has yet to be "written" to disk. A cache is something that has been "read" from the disk and stored for later use.
  更详细的解释参考:Difference Between Buffer and Cache
  对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,笔者也没有去验证共享内存对上面等式的影响。如果你有兴趣,请参考:What is Shared Memory?
  cache 和 buffer的区别:
  Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。
  Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。
  Free中的buffer和cache:(它们都是占用内存):
  buffer : 作为buffer cache的内存,是块设备的读写缓冲区
  cache: 作为page cache的内存, 文件系统的cache
  如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi会非常小
 
内存释放机制

/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整.那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存.操作如下:

cat /proc/sys/vm/drop_caches
0
首先,/proc/sys/vm/drop_caches的值,默认为0

sync

手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)

 echo 3 > /proc/sys/vm/drop_caches
cat /proc/sys/vm/drop_caches
3

将/proc/sys/vm/drop_caches值设为3

请查看图片,已经将内存释放。
 

  可以看出内存已释放完毕。

相关文章推荐

linux内存清理和swap内存释放办法

如果swap空间使用到30%以上,系统就变得很慢,如果物理内存够,就需要清理下。 原文:http://wushank.blog.51cto.com/3489095/1255906 ...
  • longxj04
  • longxj04
  • 2014年01月10日 16:56
  • 16945

手工释放linux内存

当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法。那么我来谈谈这个问题...
  • xuyaqun
  • xuyaqun
  • 2010年03月01日 13:37
  • 917

linux 内存清理/释放命令

在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好。但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间影响性能,此时就需要执行释放内存(清理缓存)的操作了。...

对Linux堆内存释放的总结

http://bbs.chinaunix.net/thread-2195511-1-1.html Linux用户进程是如何释放内存的 Linux进程使用内存的基本流程:   从图中我们可以看出,进程的...

vector内存释放机制

vector   中的内建有内存管理,当   vector   离开它的生存期的时候,它的析构函数会把   vector   中的元素销毁,并释放它们所占用的空间,所以用   vector   一般不...

vector内存释放机制

vector   中的内建有内存管理,当   vector   离开它的生存期的时候,它的析构函数会把   vector   中的元素销毁,并释放它们所占用的空间,所以用   vector   一般不...
  • Gypsyy
  • Gypsyy
  • 2012年06月11日 15:51
  • 7957

JAVA内存释放机制

★JVM的内存?   在Java虚拟机规范中(具体章节请看“这里 ”),提及了如下几种类型的内存空间:   ◇栈内存(Stack):每个线程私有的。   ◇堆内存(Heap):所有线程公用的...

delete内存释放机制

同事在项目中使用new/delete的时候发现一个奇怪的现象: int32_t i; std::queue qTest; for (i = 0; i     char *p = new char[1...
  • tusing
  • tusing
  • 2013年07月03日 10:02
  • 832

Java内存释放机制

和内存释放(主要是GC)有关的话题。     ★JVM的内存?   在Java虚拟机规范中(具体章节请看“这里 ”),提及了如下几种类型的内存空间:   ◇栈内存(Stack):每个线程私有的...

JAVA内存释放机制

和内存释放(主要是GC)有关的话题。     ★JVM的内存?   在Java虚拟机规范中(具体章节请看“这里 ”),提及了如下几种类型的内存空间:   ◇栈内存(Stack):每个线程私有的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux内存释放机制
举报原因:
原因补充:

(最多只允许输入30个字)