当存在大量“非活动内存”时,为什么OS X使用swap?


22

我从几个月开始使用OS X(Lion和现在的Mountain Lion)。我的mini上有8 GB,现在几乎每天都差不多。在具有8 GB的Windows 7计算机上,我从未遇到过此类问题。无论如何,我在网上读到,不活动内存是最近关闭的程序的应用程序缓存,可用于更快地重新打开。如果需要,可以将不活动内存释放给新应用程序。它没有发布。而是OS X开始交换。所以我的问题是,当有很多“非活动内存”时,为什么OS X使用swap?这是显示我的意思的屏幕:

在此处输入图片说明

我确实希望OS X能够在开始交换之前使用那些2.69 GB的空间。


是的,这很奇怪。这是一个占用所有RAM的应用程序吗?也许OSX限制了应用程序不要一次使用80%以上的RAM。不活动并不表示免费。它是为某些事物保留的。
Piotr Kula 2012年

否-许多应用程序,浏览器,Eclipse等都是免费的,因为最近关闭了应用程序缓存。应该有办法使OS X在内存不活动时不进行交换
Balchev,2012年

我可以随时复制它,并可以在需要时制作活动监视器的屏幕
Balchev 2012年

2
非活动内存不是可用内存。
kinokijuf 2012年

2
@kinokijuf它应该在没有可用内存的情况下充当可用内存。如果无论如何总是将不活动的内存交换到磁盘,则区分活动-非活动毫无意义。
Pieter

Answers:


18

当不活动的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内部的更多信息。还有一些建议,以防您由于沙滩球问题(通常与它无关)而开始调查内存使用情况。

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


1
嗨,不确定您是否了解我-我正在谈论的是当您有100-200MB的可用内存,2.6 GB的“非活动”并启动另一个程序时,让我们说eclipse,xcode等。发生的事情是它没有使用那些2.6 GB,而是从活动内存中进行交换。不确定您是否明白我的意思。无论如何,感谢您的回答
Balchev 2012年

现在很清楚。也许您应该在此注释中添加示例。我添加了其他信息,我认为这些信息可以为您观察到的内容提供充分的解释。
m000 2012年

不知道我是否应该删除原始答案。它解释了另一种情况(因为在您发表评论之前我没有正确回答您的问题),并可能使人们感到困惑。
m000 2012年

因此,正如Radoo在他的评论中所说-“ OS X是饥饿的野兽”。我没想到OS X会占用那么多内存(Lion和现在的Mountain Lion),所以这就是为什么我认为这里有些东西。谢谢您的最新答案。
巴尔切夫2012年

6

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

试试这些命令。

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

我在网上仔细阅读过,禁用OSX上的交换可能会导致系统异常行为并崩溃。这是真的?
巴尔切夫2012年

当您的内存不足时,它会。但是,如果您有足够的内存(例如8 Gb),则不会造成任何问题。
arundevma 2012年

2
“足够的内存,例如8 Gb” –对不起,太可爱了……:)
Bombe

0

您无能为力。为什么这样做呢?因为这正是OS X的工作方式。有趣的是,Mac每次睡眠都会占用的内存越来越大。

你能做什么:

  1. 升级RAM。
  2. 必要时,运行神圣的“ purge ”命令清除大部分不活动的内存。
  3. 禁用交换http://osxdaily.com/2010/10/08/mac-virtual-memory-swap/

嗨,我使用了清除命令,但大多数情况下它释放的内存少于“非活动”内存的一半。我读到在OSX上禁用交换功能可能会导致系统异常运行并崩溃。所以我选择了1)现在可以使用16 GB的内存了:)只是用于服务器而不是台式机的内存量:)谢谢您的答案
巴尔切夫2012年

我的Macbook pro上有16GB,不是服务器。:)众所周知,OS X在内存方面是一个饥肠be的动物,尤其是同时使用多个中型/大型应用程序时。我设法在不打开任何图像/视频编辑软件,仅一些游戏和小型应用程序的情况下填充了所有16GB的存储空间。非活动内存约为4GB ...

您还必须考虑到许多OS X应用程序已经是64位。由于寻址空间越来越大,因此64位应用程序比32位应用程序分配更多的内存。

0

系统正在按设计工作。即使没有内存压力,也可以写一些无法丢弃但最近在系统不忙时尚未用于交换的页面。这样,如果以后存在内存压力,则可以从RAM中逐出这些页面,而不必在系统繁忙时首先将它们写入以进行交换。


1
当时设计不好。在分配和使用交换空间时过于激进。
塔'18

为什么这有关系?如果有很多免费交换空间,则分配交换空间是无害的。当交换不包含所需数据时,尤其如此,因为删除分配没有成本。这是一个很好的设计-在几乎没有成本的情况下进行艰苦的工作,而不是在系统承受压力时将其推迟到以后。
David Schwartz '18

2
当它过于激进并导致程序中的结结或挂断时,这是不好的设计,它错误地将其标记为不活动,并开始进入交换。与此同时,RAM中还有另外8个演出:/
mendota '18

我同意门多塔。完全禁用交换功能后,我的系统将平稳运行而不会出现卡顿现象。
安东·库兹敏

@AntonKuzmin确实与这个问题有关。如果您阅读了这个问题,那么它根本不会说出口吃或任何问题。
David Schwartz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.