浅谈Linux内存管理机制

Linux的可定制性比Windows强得多,你想要什么服务及功能就安装什么,不想要就不安装,可以实现系统的最大程度的精简化,这一点Windows是无法做到的。所以,实现同样的功能,Linux比Windows对硬件的要求更低,也正是由于这个原因,很多人陷入了一个误区:Linux内存开销比Windows要小的多。其实不然,Linux的内存开销比Windows要大的多,可以这么说:你有多少内存Linux就”吃“你多少内存。

说到这有些人可能会以为我是在胡扯,用事实说话,以博主的电脑为例,系统:Ubuntu 14.04,看下现在的内存使用情况,先free一下看看使用情况:

free

可以看到可用内存现在只有197M,已经使用7689M,很吓人吧,楼主就打开了几个进程就使用了将近8个G的内存,我们使用top查看一下是什么程序占用了这么大内存,我们以内存使用大小排序:

top

可以看到所有进程加到一起占用也不过百分之十几。难道是系统问题?当然不是。以上面的图片为例,我们简单分析一下Linux的内存管理机制。 在谈Linux的内存管理之前我们先稍微了解一下Windows的内存管理,Windows的内存管理没有什么特别,就是使用多少程序,占用多少内存,所以在Windows下我们如果打开很少的进程,查看任务管理器,可以看到内存使用很低,关闭程序之后,程序所占用的内存也将被释放,然而Linux并不是这样,Linux的观点则是:内存的读写速度相对硬盘来说很快,应该充分被利用起来,如果有多余的内存没有使用则是一种浪费。为了提高文件读取的性能,在程序运行的时候Linux会将要使用的数据暂存到buffers和cache(内存的读写速度比硬盘块的多),以便提高程序的运行速度,当有了新的程序需要内存的时候,系统会释放一部分内存供其使用。有了这样的思想区别,所以就有了Linux占用内存很大的现象。 说到这,有些人又会有一个误区:内存使用率过大就会变得很卡,其实这是一个在Windows平台上的误区,这个观点适用于Windows,并不适用于Linux。更合适的说法是:如果仅从内存方面考虑,内存使用率过大并不是变得很卡的原因,根本原因是没有更多”可利用的”内存可以使用才会卡。 我们再仔细看一下free命令,

free

我先解释一下他的各个含义: 第一行的total就是总共的意思,used和free是已经使用和空闲内存的意思,shared是指共享内存,buffers指缓冲区内存,cached是指缓存区内存,第二行的Mem表示物理内存,第三行的-/+ buffers/cache有两个数据,第一个是- buffers/cache,他表示被系统实实在在吃掉的内存,而+ buffers/cache则表示可以释放挪用的内存,当你打开新的进程需要内存的时候,系统会自动释放一部分这里的内存。第三行表示虚拟内存,也就是装系统的时候分出来的交换分区,这是磁盘上划分出来的,当内存条上的内存不够用时,这部分就会被利用上。 如果这个东西不够直观,再上一张PHP探针的图:

t

可以看到物理内存确实使用很多,但是看到真实内存使用却不足2个G。 有了上面的解释就很容易理解为什么Linux占用内存很大了,简单来说就是Linux不会放过任何使用内存的机会,这样可以使程序运行更快,但是当你打开另外一个进程的时候,系统会自动释放部分内存供新的进程使用,所以,看到内存使用过高的时候不用担心,这就是Linux下优秀的内存管理机制,这种机制使得硬件的性能被充分利用,这种内存管理机制比Windows的内存管理更为优秀,只是看起来没有Windows好看而已。所以有这个一个说法:Windows上的内存是用来看的,Linux上的内存是用来用的。