当不活动的RAM页面实际处于活动状态时,显然发生了交换。
(更新:正如评论中所阐明的,这不是您的情况。因此,有相同问题的人可以跳到水平尺。)
也就是说,您运行了许多程序,内核换出了一些页面。然后,您退出了一些程序。内核将其RAM页标记为不活动。但是在需要这些页面之前,它不会将页面交换回RAM。这将导致同时具有无效页面和换出页面。
为什么不抢先换页?因为那将赌注于赔率:从长远来看,你输了。让我们考虑一个简化的示例:两个程序A和B不能同时放入RAM。程序A仍在运行,所有换出的页面都属于A。程序B已退出,所有不活动的页面均属于B。
如果内核抢先交换A的页面并在之后立即交换:
- 程序A需要访问它的页面->您赢了-页面已经在RAM中。
- 您再次启动B->丢失-您“支付”了将页面带到RAM的费用,现在您必须将它们发回。
- 您启动另一个程序C->如果A和C不能同时放入RAM,则会丢失。如果适合,您甚至可以。
还应考虑到换出(写入磁盘)比换入(从磁盘读取)要昂贵。这使得这种“下注”更加没有吸引力。
简而言之:相信您的内核,不要试图超越它。
更新:
事实证明,不活动的内存不起作用,因为“ 使用活动监视器读取系统内存”一文使许多人相信它是有效的。本文中为非活动内存提供的定义是正确的:
该信息在RAM中,但未被有效使用,最近才使用。
但是以下示例完全是误导性的并且过于简化(例如我的示例很坦率):
例如,如果您一直在使用Mail,然后退出它,则Mail所使用的RAM被标记为非活动内存。闲置内存可供其他应用程序使用,就像可用内存一样。但是,如果在其他应用程序使用其非活动内存之前打开Mail,则Mail将打开得更快,因为其非活动内存已转换为活动内存,而不是从速度较慢的驱动器加载它。
我搜索了更多在线资源,并最终在darwin内核邮件列表中找到了这个线程,该列表非常有用。引用吉姆·马吉(Jim Magee)(来自达尔文团队-我认为):
简而言之,内核VM系统在处理内存压力时会扫描使用中的页面,并试图使它们在活动标记和非活动标记之间保持平衡。标记为非活动时,将扫描非活动页面以进行重用。如果它们已被重用,则将它们标记为活动状态,并且某些其他页面必须从活动状态转换为非活动状态以检测其是否处于活动状态。因此,不活跃是错误的称呼。它是“可能处于非活动状态,请尝试进行验证”的简写。
如您所见,我们(目前)努力争取的内部平衡大约是有效的2/3与无效的1/3 ...
这说明了您观察到的行为。也就是说,您看到的无效页面属于正在运行的程序,这些程序最近并未使用过。因此,当您启动新程序时,不活动的页面将被换出。同时,其他程序的页面被标记为无效,以保持有效与无效的2/1比率。
该线程还包含一些建议,以了解有关darwin内部的更多信息。还有一些建议,以防您由于沙滩球问题(通常与它无关)而开始调查内存使用情况。
结论仍然是相同的:相信您的内核,不要试图超越它。:-)