转载

教你看懂MAC OS Mavericks活动监视器里的内存

这个界面有点变化,出现了一个“已压缩”项目。为让更多人了解这是怎么一回事,这里不用太多术语,某些词汇转用中文表达。
<ignore_js_op>

教你看懂MAC OS Mavericks活动监视器里的内存

物理内存:这个不需要解释了吧

已使用内存:这个值就是当前物理内存已经被使用的总量,为右边四项(用用程序内存,文件缓存,联动内存,已压缩)的总和。

虚拟内存:为Mach(不是Mac哦)的虚拟储存器管理系统所管理的虚拟内存总量,这个值是 物理内存和被转移到硬盘的数据还有已被压缩的内存的总和。如果等于当前物理内存,即说明没有任何出页面数据产生。当数据超出物理内存的大小,多出的部分就是被移出的量,但是当这种现象缓解以后(已使用内存低于物理内存)这些数据不会主动恢复到主存。但是当进程尝试访问这些被移出的数据时,系统才会将它们恢复到主存。这里个人猜测一下,出页面不一定产生I/O读写的,试想象一个情况,某个进程需要打开一张照片,那么就需要请求系统通过I/O调度将照片载入内存,然后提供给进程访问。那么当这个进程闲置,照片被关闭(实际上还占用着文件缓存),当有需要的时候系统将这个照片的缓存移出页面。有一种情况是需要考虑的,照片是否被修改。假如照片是没有被修改的话,那么内容就完全跟硬盘同样位置上的照片一样,系统不需要再将这照片放回硬盘,只需要在内存里清空数据就可以了,所以这里尽管是“出页面”但无I/O数据产生。如果照片被修改的话,当然就会产生I/O数据了。

已使用的交换:最近因进程请求更多内存而将部分页面移出的数据量,判断内存是否足够,这个值也很重要。如果经常见到有大量数据,那么就需要添加内存了。只有在进程需要更多内存且物理内存已满的情况下才会产生这个数据。但是有大量的出页面数据也不一定会令这个值上涨,因为移出页面的数据只是单纯移出并不是其它进程在请求内存。

应用程序内存:这部分是程序运行需要的堆栈内存的总量。

文件缓存:这部分为操作系统将硬盘本地文件缓存到内存上的数据,例如某个进程需要读写本地某个文件,那么操作系统内核就会将这个文件缓存到内存上让这个进程访问。

联动内存:这部分为操作系统的内核进程占用,不可被压缩。

已压缩:这个是重点,先从Mach几种内存标识说起。Mach有一个内存跟踪机制,可以跟踪内存数据的使用情况,从而调用合适的算法来分配。
以下部分只是从活动监视器里移出罢了,现在的10.9还是使用这种模式。
空闲:即没被使用的内存
活跃:刚刚被修过或使用过的数据
非活跃:大部分是被文件缓存和闲置进程占用
10.9后,当物理内存已经被占满(大部分非活跃,即文件缓存)后,系统产用的策略是将文件缓存进行压缩,所以能在“已压缩”项目里观察到数据的产生。当文件缓存不可能再被压缩了,系统就选择将部分数据移出页面,就是将数据转移到下一级储存器(即硬盘),这时就产生出页面。
10.8是没有使用压缩技术的,所以当内存被占满后,系统是会将非活跃内存直接移出页面并产生出页面数据,无疑加大I/O的压力。有了内存压缩技术,10.9可以尽可能地将文件缓存到内存,让进程访问这些文件的速度增加。

下面解释一下我这张比较夸张的图,为了测试内存我将一个以前的DEMO来演示一下。正常的状况是如下图:
这个CopyFile程序只占用3.5M,而且一直也只占用3.5。这个程序的作用是将一个文件拷贝到指定位置,我这里用了OS X的安装镜像,大小为5G来测试。从下图可以看到监视器的文件缓存占用非常大,这是肯定的了,因为程序在不停将源文件读入内存。可以看出几乎是没有产生多少压缩数据的。

<ignore_js_op>

教你看懂MAC OS Mavericks活动监视器里的内存

下面改写一下这个程序,将自动释放池注释掉:
正常的程序在每次从源文件读入数据然后写到磁盘后会将之前读入内存的数据释放掉,所以程序才能保持在3.5M这样的占用。如果关闭了自动释放池,那么就如下图了,CoplyFile这个程序自身占用的内存暴增,加上源文件的文件缓存,这个数值非常客观,从而产生了大量的内存压力,和出页面数据。可以看到这里的虚拟内存已经到10G,也就是已经有2G的数据被移出硬盘了。

<ignore_js_op>

教你看懂MAC OS Mavericks活动监视器里的内存

日常使用怎么判断内存是否够用呢?这个主题非常微妙,因为对OS X来说,内存永远不够,平时随便一用物理内存就没有了。但是别灰心,这些物理内存用在了合适的地方,主要用做了文件缓存。如果内存压力一直处于地位,且数据未被压缩,你的内存是非常充裕的,即使你这时再添加几个进程也只是为内存压力增加那么一点点罢了。只要虚拟内存超出部分不会太多,且数据交换量不大,你机器还是保持在最佳状态。

顺便提一下purge这个命令, 在10.9下是需要权限才能使用,sudo purge。实际上这个命令清空的只是一些没被修改的文件缓存,例如我上面的那个程序产生的那些数据。运行结束后我都会purge一下,因为我知道清空的确切内容,而这些内容是我不再需要的。这个命令不要滥用,别遇到什么情况都来一下,这样就与Mach的内容管理机制作对。

最后补充一下一个小细节,也许你们注意到已使用内存是没超过8G但是却产生出页面数据。举个简单的例子吧,有八个格子,张三使用了两个,李四使用了5个。这是王5需要2个,可是没有多余空间了,所以只好将张三的格子里的东西拿到别地方,让自己的东西放入去。。这样就产生一个碎片。。。就是所谓的内存碎片了。

Leave a Reply

学习的梦想

锤炼的彩色