当有大量“非活动内存”时,为什么 OS X 会使用交换?

当有大量“非活动内存”时,为什么 OS X 会使用交换?

我已经使用 OS X 几个月了(Lion 和现在的 Mountain Lion)。我的 mini 上有 8 GB 的内存,现在几乎每天都会用到这个数。在有 8 GB 的 Windows 7 机器上,我从来没有遇到过这种问题。无论如何,我在网上看到,非活动内存是最近关闭的程序的应用程序缓存,可用于更快地重新打开。如果需要,可以将这些非活动内存释放给新应用程序。它并没有被释放。相反,OS X 开始交换。所以我的问题是,当有大量“非活动内存”时,OS X 为什么使用交换?以下屏幕显示了我的意思:

在此处输入图片描述

我真的希望有一种方法可以让 OS X 在开始交换之前使用这 2.69 GB。我真的希望。

答案1

交换显然是在非活动 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,Mail 将打开得更快,因为其非活动内存已转换为活动内存,而不是从较慢的驱动器加载。

我搜索了更多在线资源,最终此主题在 darwin 内核邮件列表中,它提供了相当丰富的信息。引用 Jim Magee(我认为是来自 darwin 团队)的话:

简而言之,内核虚拟机系统在处理内存压力时会扫描正在使用的页面,并尝试使它们在活动和非活动标记之间保持平衡。扫描非活动页面并将其标记为非活动状态,以便重新使用。如果它们已被重新使用,则将其标记为活动,并且其他页面必须从活动状态变为非活动状态,以检测它是否正在活动使用中。因此,非活动状态是一个误称。它是“可能处于非活动状态,让我们尝试验证这一点”的简写。

正如您所发现的,我们(当前)追求的内部平衡大约是 2/3 活跃,1/3 不活跃......

这解释了您观察到的行为。即,您看到的非活动页面属于最近未使用的正在运行的程序。因此,当您启动新程序时,非活动页面会被换出。同时,其他程序的页面被标记为非活动,以保持活动与非活动 2/1 的比例。

线还包含一些有关了解 Darwin 内部结构的建议。如果您因为 Beachball 问题(通常与此关系不大)而开始调查内存使用情况,这里还有一些建议。

结论仍然是一样的:相信你的内核,不要试图超越它。:-)

答案2

如果您有足够的内存,您可以安全地禁用分页。

尝试这些命令。

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
sudo rm /private/var/vm/swapfile*

然后重新启动并验证 dynamic_pager 进程不再运行。

确保没有在中创建交换文件/private/var/vm/

要重新启用,请尝试以下命令:

sudo launchctl load -wF /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist

您还可以禁用 Spotlight 以释放更多内存并减少磁盘活动。以下命令用于禁用和启用 Spotlight。

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist
sudo launchctl load -wF /System/Library/LaunchDaemons/com.apple.metadata.mds.plist

答案3

您能做的不多。为什么会这样?因为这就是 OS X 的工作方式。有趣的是,Mac 每次休眠时占用的内存都会变得越来越大。

你能做什么:

  1. 升级 RAM。
  2. 奔跑圣洁”清除“命令在必要时清除大部分非活动内存。
  3. 禁用交换http://osxdaily.com/2010/10/08/mac-virtual-memory-swap/

答案4

系统按设计运行。即使没有内存压力,在系统不忙时将一些无法丢弃但最近未使用的页面写入交换也是有意义的。这样,如果稍后出现内存压力,这些页面可以从 RAM 中逐出,而无需在系统繁忙时先将它们写入交换。

相关内容