linux内存管理机制以及free命令详解
一、linux内存管理机制
1.物理内存和虚拟内存
直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。
物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。
作为物理内存的扩展,linux会在物理内存不足,使用交换分区的虚拟内存,更详细的说,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。
2. Linux的内存管理是分页存取机制
分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。
Linux系统会根据系统配置不时地进行页面交换操作,以保持一定量的空闲物理内存,有些配置下即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面
Linux 进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,linux内核根据”最近最经常使用“算法,仅仅将一些不经常使用的页面文件交换到虚拟 内存,有时我们会看到这么一个现象:linux物理内存还有很多,但是交换空间也使用了很多。其实,这并不奇怪,例如:一个占用很大内存的进程运行时,需 要耗费很多内存资源,此时就会有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面 文件并不会自动的交换进物理内存,除非有这个必要,那么此刻系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。关于这点,不 用担心什么,只要知道是怎么一回事就可以了。
交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会导致linux出现假死机、服务异常等问题,linux虽 然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。
二、监控内存
监控内存的使用状态是非常重要的,通过监控有助于了解内存的使用状态,比如内存占用是否正常,内存是否紧缺等等,监控内存最常使用的命令free
其中free默认单位是KB
free -m单位为MB
free -g单位为GB
针对free这个命令,对详细的数据进行分析
1.其中的相关说明:
Mem:表示物理内存统计
-/+ buffers/cached:表示物理内存的缓存统计
Swap:表示硬盘上交换分区的使用情况
系统的总物理内存:16334124Kb,但系统当前真正可用的内存并不是第一行free标记的1397016 Kb,它仅代表未被分配的内存。
我们使用total1、used1、free1、used2、free2等名称来代表上面统计数据的各值,1、2分别代表第一行(不考虑标题行)和第二行(不考虑标题行)的数据。
--------第一行数据:代表内核角度的统计--------
total1:表示物理内存总量。
used1:表示已使用(已分配出去)的物理内存总量,包括真正已使用和分配给缓存(包含buffers与cached)的数量。
free1:未被分配的物理内存。
shared1:共享内存,一般系统不会用到,这里也不讨论。
buffers1: 系统分配给buffers的内存大小。
cached1:系统分配给cached的内存数量。buffer与cache的区别见后面。
--------第二行数据:代表应用角度的统计--------
used2:实际使用内存总量。
free2:系统当前实际可用内存,包括未被分配的内存以及分配给buffers与cached的内存之和。这就是系统当前实际可用内存。
可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数.
对操作系统来讲是Mem的参数.buffers1/cached1都是属于被使用
对应用程序来讲是(-/+ buffers/cach).buffers1/cached1是等同可用的,因为buffers1/cached1是为了提高程序执行的性能,当程序使用内存时,buffers1/cached1会很快地被使用
所以,以应用来看看,以(-/+ buffers/cache)的used和free为主.所以我们看这个就好了
2.结论从上面的描述我们可以四个结论,分别是
1)total1 = used1 + free1
总的物理内存total1 = 已分配出去的物理内存used1+ 未被分配的物理内存free1即16334124 = 14937108 +1397016
2)total1 = used2 + free2
总的物理内存total1 = 实际使用的内存总量used2 +系统当前实际可用内存free2即16334124 = 9959888 + 6374236
3)used1 = buffers1 + cached1 + used2
已分配出去的物理内存used1 = 系统分配给buffers 的内存大小+系统分配给cached的内存数量+实际使用内存总量used2即14937108= 50360+4926860+9959888
4)free2 = buffers1 + cached1 + free1
系统当前实际可用内存free2 = 系统分配给buffers 的内存大小+系统分配给cached的内存数量+被分配的物理内存free1即6374236= 50360 +4926860+1397016
3.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。