经常遇到一些刚接触 Linux 的新手会问内存占用怎么那么多?我也没运行什么啊?一看就是被 Windows 的内存气泡吓到了,生怕 Linux 系统会卡顿甚至宕机。但是大家有没有发现就算内存占用了很多,Linux 依旧不卡顿,今天杜老师就聊一下 Linux 内存管理机制!
在 Linux 中经常会发现空闲内存很少,似乎所有的内存都被系统占用了,表面的感觉是内存不够用了。其实不然,这是 Linux 内存管理的一个优秀特性,在这方面,区别于 Windows 内存管理。
主要的特点是,无论物理的内存有多大,Linux 都将其充分利用,将一些程序调用过的硬盘数据读入内存中,利用内存读写的高速特性来提高 Linux 系统的数据访问性能。
而 Windows 是只在需要内存时,才为应用程序分配内存,并不能充分利用大容量内存空间。
换句话说,增加一些物理内存,Linux 都将能充分利用起来,发挥了硬件投资带来的好处,而 Windows 将其做为摆设,即使增加更大。
Linux 的这一特性,主要是利用空闲的物理内存,划分出一部份空间,做为 buff/cache 来使用,以此提高数据访问性能。
页高速缓存 cache 是 Linux 内核中实现的一种主要磁盘缓存。它主要用来减少对磁盘的 I/O 操作。
具体地讲,是通过把磁盘中的数据缓存到物理内存中,把磁盘的访问变为对物理内存的访问。
磁盘高速缓存价值在于两个方面:
我们知道,直接从物理内存读写数据要比从硬盘中读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存的容量是有限的,这样就引出了物理内存与虚拟内存的概念。
物理内存是系统硬件提供的内存大小,是真正的内存,而相对于物理内存,在 Linux 下还有一个虚拟内存的概念,虚拟内存是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间。
作为物理内存扩展,Linux 会在物理内存不足时,会使用交换分区的虚拟内存,详细的说,就是内核会将暂时不用的内存块信息写到交换空间,这样一来,物理内存就得到了释放,这块内存就可以用于其它目的了,当需要用到原始内容时,这些信息会被重新从交换空间读入到物理内存。
Linux 的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。
Linux 系统会时不时的进行页面交换操作,以保持尽可能多的空闲物理内存,即使没有什么事情需要内存,也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间。
Linux 进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,Linux 内核根据最近最经常使用算法,仅仅将一些不经常使用的页面文件交换到虚拟内存,有时我们会看到这么个现象:Linux 的物理内存还有很多,但是交换空间也使用了很多。
其实,这不奇怪,例如,一个占用很大内存的进程运行时,需要耗费很多内存资源,此时就会有一些不常用的页面文件被交换到虚拟内存中,后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面文件不会自动的交换进物理内存,除非是有这个必要,那么此刻系统物理内存就会空闲很多,同时交换空间也被使用,就出现了刚才所说的现象了。关于这点,不用担心什么,只要知道是怎么一回事就可以了。
交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们会被马上交换出去,如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,最终导致 Linux 出现假死机、服务异常问题,虽然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。因此,合理规划和设计 Linux 内存使用,是非常重要的。