free命令是Linux系统下用来查看内存使用情况的,例如:

$ free -h
total used free shared buffers cached
Mem: 7.8G 6.6G 1.3G 0B 600M 1.9G
-/+ buffers/cache: 4.1G 3.7G
Swap: 2.0G 0B 2.0G

第一行Mem是从操作系统层面看到的内存使用情况,total表示物理内存总量,used表示当前已使用量,free表示当前未分配内 存,shared表示共享内存大小,可能已废弃,固定为0,buffers和cached表示被操作系统用来当做磁盘高速缓存的内存大小。这里 total=used+free,并且buffers和cached包含在used里,因为在操作系统看来,用于缓存的内存也是属于被用掉的内存。

第二行-/+ buffers/cache从程序角度看到的内存使用情况,used表示被当前系统中所有进程用掉的物理内存大小,free表示当前程序可用的物理内存大 小。从数值上看,used=Mem:used-buffers-cached,free=Mem:free+buffers+cached。这里涉及到 Linux对内存的管理方式,buffers和cached是两种不同类型的磁盘高速缓存,分别称为块缓存(buffer cache)和页缓存(page cache)。当物理内存剩余充分的时候,操作系统可能会将非常多的空闲内存用作缓存,借以提升磁盘IO性能,这种机制造成的特有现象就是很多时候 Mem:free值很低,而buffers和cached的值很高,这个时候并不意味着内存吃紧。当有应用程序需要分配内存时,操作系统会逐渐回收 buffers和cached占用的内存空间,这个过程中,Mem:used和Mem:free值不会有大的变动,但是-/+ buffers/cache used和free会体现出变化,具体表现为free值减少,used值增加。所以,第二行的-/+ buffers/cache往往比第一行的Mem统计数据更有参考意义,因为第二行显示的才是当前操作系统真正可用的内存使用量和剩余量。

第三行Swap表示交换空间的使用情况,Swap存在于磁盘中,可以认为是内存的扩展,当应用程序继续吃进内存,操作系统已经没有多余 buffers和cached可供回收时,就会将一部分内存页交换到Swap区,以便腾出可用的物理内存。假如此时某个进程关闭腾出了大块物理内存 (used值降低,free值上升),操作系统不会把原先置换到Swap区的内存页交换回物理内存,空出来的物理内存会被用来做缓存 (buffers+cached)。

为了有个更加直观的解释,特地从网上盗图一张,加深理解:

上文的描述都未对页缓存和块缓存进行具体区分,实际上,两者还是有一定区别的。简单来说,页缓存(page cache)为了提升文件内容的读写效率,属于文件系统级别的缓存;块缓存(buffer cache)为了提升块设备的读写效率,属于磁盘级别的缓存。

Linux下文件系统中的文件是由文件内容和元信息(inode)两部分组成的,其中文件内容是分散存储在磁盘的不同块中,通过元信息来组织和描
述,这些磁盘上的块数据形成了一个逻辑意义上的文件。因此,磁盘高速缓存机制分成两个层次。当操作系统通过文件系统接口读出文件时,文件内容会被缓存在页
缓存里;当文件系统继而将文件内容从磁盘中读出时,文件内容会被缓存在块缓存里。很显然,一次读文件操作会导致文件内容被页缓存和块缓存分别缓存一
次,Linux
2.4版本之前就是这么设计的。2.6版本以后,这部分功能进行了优化,对于文件内容的读写,块缓存中的地址被指向到页缓存中,从此,内存中只有一份文件
内容的缓存。但是,这并不意味着块缓存可以去除,因为有些场景是需要内核直接读写块设备的,这时候块缓存仍旧有着用武之地,比如读写inode,或者一些
跳过文件系统直接操作块设备的命令,如dd等。

References:
[1] Linux Kernel: What is the major difference between the buffer cache and the page cache?
[2] linux cache and buffer

转载:

http://fengchj.com/?p=2242

从free命令看Linux内存管理的更多相关文章

  1. linux 内存管理——内核的shmall 和shmmax 参数

    内核的 shmall 和 shmmax 参数 SHMMAX= 配置了最大的内存segment的大小 ------>这个设置的比SGA_MAX_SIZE大比较好. SHMMIN= 最小的内存seg ...

  2. Linux内存管理 (25)内存sysfs节点解读

    1. General 1.1 /proc/meminfo /proc/meminfo是了解Linux系统内存使用状况主要接口,也是free等命令的数据来源. 下面是cat /proc/meminfo的 ...

  3. [转帖]linux 内存管理——内核的shmall 和shmmax 参数

    (转)linux 内存管理——内核的shmall 和shmmax 参数   内核的 shmall 和 shmmax 参数 SHMMAX= 配置了最大的内存segment的大小 ------>这个 ...

  4. (转)linux 内存管理——内核的shmall 和shmmax 参数

    内核的 shmall 和 shmmax 参数 SHMMAX= 配置了最大的内存segment的大小 ------>这个设置的比SGA_MAX_SIZE大比较好. SHMMIN= 最小的内存seg ...

  5. Linux内存管理 【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-4491368.html Linux内存管理 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理 ...

  6. Linux内存管理【转】

    转自:http://www.cnblogs.com/wuchanming/p/4360264.html 转载:http://www.kerneltravel.net/journal/v/mem.htm ...

  7. Linux内存管理-内核的shmall和shmmax参数(性能调优)(转)

    内核的shmall和shmmax参数 SHMMAX=配置了最大的内存segment的大小:这个设置的比SGA_MAX_SIZE大比较好. SHMMIN=最小的内存segment的大小 SHMMNI=整 ...

  8. Linux内存管理(最透彻的一篇)【转】

    转自:https://www.cnblogs.com/ralap7/p/9184773.html 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物 ...

  9. 【转】Linux内存管理(最透彻的一篇)

    摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在 ...

随机推荐

  1. 小学生之Log4j使用教程

    以前都是把所有日志都输出到一个文件下面,今天有个同事问想把某个包下的日志输出到 指定的地方,于是就在网上查了一些资料,总结一下,以免以后用到. 一.log4j是什么?  Log4j是一个开源的日志记录 ...

  2. web前端技术

    在网上找了点前端资料,记录下来,以便后面工作可能用到. Flat UI:一个WEB界面工具组件库.很多漂亮的菜单.按钮等. stickUp:一个jquery插件,可以将页面中的元素固定.经常用在把菜单 ...

  3. 安装Node.js

    1.window下安装Node.js 安装git,方便使用命令行. 网址:http://www.git-scm.com/download/ 下载后直接安装即可 接着安装Node.js https:// ...

  4. (转)【已解决】关于SQL2008 “不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了‘阻止保存要求重新创建表的更改’” 解决方案

    近日在使用sql2008的过程中,要对已经创建完成的表结构进行修改,却一直提示弹出如下提示: “ 不允许保存更改.您所做的更改要求删除并重新创建以下表.您对无法重新创建的标进行了更改或者启用了“阻止保 ...

  5. 使用证书部署出现System.Security.Cryptography.CryptographicException 错误解决方案

    一.System.Security.Cryptography.CryptographicException: 找不到对象 at System.Security.Cryptography.Cryptog ...

  6. 网站压缩数据 GZIP

    //1.被压缩数据 String str="Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好H ...

  7. cas+tomcat+shiro实现单点登录-3-CAS服务器深入配置(连接MYSQL)

    目录 1.tomcat添加https安全协议 2.下载cas server端部署到tomcat上 3.CAS服务器深入配置(连接MYSQL) 4.Apache Shiro 集成Cas作为cas cli ...

  8. PM2.5空气质量指数(AQI)是如何计算的

    AQI如何计算     具体要计算PM2.5空气质量指数(AQI),SENBE申贝技术人员向您介绍如何计算的公式.     比如当实测浓度小于等于0.035时,根据实测浓度×50/0.035计算.例如 ...

  9. Say bye to CMake and Makefile

    用了几年的CMake,最近想试着琢磨如何将C++应用的动态链接全部改成静态链接,发现还需要研究CMake的用法,进入CMake的文档, http://www.cmake.org/cmake/help/ ...

  10. css3之background

    background background: (1)url(image1.png) right bottom, (2)url(image2.png) center, (3)url(image3.png ...