从free命令看Linux内存管理
free命令是Linux系统下用来查看内存使用情况的,例如:
$ free -h |
第一行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内存管理的更多相关文章
- linux 内存管理——内核的shmall 和shmmax 参数
内核的 shmall 和 shmmax 参数 SHMMAX= 配置了最大的内存segment的大小 ------>这个设置的比SGA_MAX_SIZE大比较好. SHMMIN= 最小的内存seg ...
- Linux内存管理 (25)内存sysfs节点解读
1. General 1.1 /proc/meminfo /proc/meminfo是了解Linux系统内存使用状况主要接口,也是free等命令的数据来源. 下面是cat /proc/meminfo的 ...
- [转帖]linux 内存管理——内核的shmall 和shmmax 参数
(转)linux 内存管理——内核的shmall 和shmmax 参数 内核的 shmall 和 shmmax 参数 SHMMAX= 配置了最大的内存segment的大小 ------>这个 ...
- (转)linux 内存管理——内核的shmall 和shmmax 参数
内核的 shmall 和 shmmax 参数 SHMMAX= 配置了最大的内存segment的大小 ------>这个设置的比SGA_MAX_SIZE大比较好. SHMMIN= 最小的内存seg ...
- Linux内存管理 【转】
转自:http://blog.chinaunix.net/uid-25909619-id-4491368.html Linux内存管理 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理 ...
- Linux内存管理【转】
转自:http://www.cnblogs.com/wuchanming/p/4360264.html 转载:http://www.kerneltravel.net/journal/v/mem.htm ...
- Linux内存管理-内核的shmall和shmmax参数(性能调优)(转)
内核的shmall和shmmax参数 SHMMAX=配置了最大的内存segment的大小:这个设置的比SGA_MAX_SIZE大比较好. SHMMIN=最小的内存segment的大小 SHMMNI=整 ...
- Linux内存管理(最透彻的一篇)【转】
转自:https://www.cnblogs.com/ralap7/p/9184773.html 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物 ...
- 【转】Linux内存管理(最透彻的一篇)
摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在 ...
随机推荐
- cordova热更新
cordova 热更新: 一.添加插件 1.新建Cordova项目 cordova create CordovaHotCode com.ezample.hotcode 2.添加Android平台 在新 ...
- AsyncHttpClient httpURLCon httpClient AsyncTask 访问服务器
Activity /** * 测试使用三种方式(AsyncHttpClient.httpURLCon.httpClient)分别以get和post方式访问服务器 * @author 白乾涛 */ ...
- LinkButton( 按钮)
一. 加载方式 //class 加载方式<a href="###" class="easyui-linkbutton">按钮</a> / ...
- winform中获取Properties窗口的值.
我写这个工具,主要是多次在将自己的代码和别人代码做对比时,不想繁琐地用眼看他设置的和自己设置的哪里不一样. using System; using System.Collections.Generic ...
- Activity一共有以下四种launchMode
1. standard: 无论什么情况都会生成一个新的Activity实例,并且放于栈顶. 2. singleTop:如果Activity纯在但是不位于栈顶,就重新生成一个Activity实例. 3. ...
- 使用idea将本地项目上传至github及clone
一.上传 1.firl->settings 设置git 2.firl->settings 填写自己的登录名和密码,可以使用test测试是否连接成功 3. 就搞定了.github会自动建立一 ...
- java开发中的23中设计模式
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- 一个模拟时钟的时间选择器 ClockPicker
最近开发的一个模拟时钟的时间选择器 ClockPicker,用于 Bootstrap,或者单独作为一个 jQuery 插件. 源代码托管在 GitHub 上: ClockPicker 最近项目中需要用 ...
- My SQL 常用函数
一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ABS(x) 返回x的绝对值 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大于或等于x的最小整数 ...
- 文成小盆友python-num9 socket编程
socket编程 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意思 ...