在OS X的日常使用中(根据互联网上各种帖子的说法,这是一种常见现象),只要没有“可用”内存可用,该系统就会变慢。据推测,这是由于交换引起的,因为明显有大量磁盘活动,并且vm_stat报告了许多页面输出。(纠正我的错误)
但是,交换开始/发生/结束时,“非活动”内存的数量通常约为所有可用内存的12.5%-25%(^ 1。)。
根据http://support.apple.com/kb/ht1342:
无效的内存
内存中的该信息并未得到积极使用,但是最近才被使用。
例如,如果您一直在使用Mail,然后退出它,则Mail所使用的RAM被标记为非活动内存。此闲置内存可供其他应用程序使用,就像可用内存一样。但是,如果在其他应用程序使用其非活动内存之前打开邮件,则Mail将打开得更快,因为其非活动内存已转换为活动内存,而不是从速度较慢的硬盘加载邮件。
非活动列表包含当前驻留在物理内存中但最近未访问过的页面。这些页面包含有效数据,但可以随时从内存中释放。
因此,基本上:程序退出后,其内存将被标记为“不活动”,并且应随时可以声明。尽管如此,每当“可用”内存变低时,OS X仍希望开始将内存换出到Swap文件中,而不是仅声明该内存。
为什么?比起立即释放不活动的内存甚至不触摸交换文件,此行为的优点是什么?一些消息来源(^ 2。)表示OS X会在释放它之前调出“非活动”内存以进行交换,但是如果现在可以随时从内存中释放内存,那现在变得没有意义了吗?交换很昂贵,发布很便宜,对吧?
可以使用某些首选项或已知的技巧来更改此行为吗?(最好不要完全禁用swap / dynamic_pager并重新启动...)
我确实感谢purge命令以及修复磁盘权限以强制使用一些可用内存的概念,但是与真正解决交换/释放决策逻辑相比,这是痛苦地强制使用更多可用内存的方法...
顺便说一句类似的问题在这里问:http://forums.macnn.com/90/mac-os-x/434650/why-does-os-x-swap-when/这里:HTTP://hintsforums.macworld .com / showthread.php?t = 87688,但是即使OP重新提出了核心问题,也没有任何答复能解决该问题的答案...
^ 1。更新2012年3月17日自从我第一次发布此问题以来,我的内存已从4gb变为8gb,问题仍然存在。以前,“非活动” ram的数量为0.5gb-1.0gb,现在在交换开始/发生/结束时通常约为1.0-2.0GB,即osx似乎将大约12.5%-25%的ram保留为“非活动”内核逻辑。
一旦使用完所有内存(可用内存为0),操作系统就会将非活动内存写出到交换文件中,以在活动内存中留出更多空间。
更新2012年3月17日
这是到目前为止建议的一些方法的综述:
所述吹扫命令
“用于通过冷盘缓冲区高速缓存来近似初始启动条件以进行性能分析。它不会影响通过malloc,vm_allocate等分配的匿名内存。”
这对于防止osx换出磁盘缓存很有用(这很荒谬,osx实际上是这样做的),但缺点是释放了磁盘缓存,这意味着如果磁盘缓存不打算换出后,最终只会得到一个冷盘缓冲区高速缓存,可能会对性能产生负面影响。
该FreeMemory应用程序和/或修复磁盘权限,迫使一些免费存储
无济于事地释放任何内存,仅将GB的内存内容从ram移动到hd。最后,当我尝试使用释放内存时打开的应用程序时,这会导致大量交换,因为它的许多虚拟机现在都处于交换状态。
使用dynamicpagerwrapper加速交换分配
为了加快交换使用速度似乎是一件好事,但是在内存仍然处于非活动状态时,首先没有解决osx交换的问题。
通过禁用dynamicpager并重新启动来禁用交换
使用所有内存时,这将迫使osx不使用swap来挂起系统挂起的价格。并非可行的选择...
使用被入侵的dynamicpager禁用交换
类似于禁用上面的dynamicpager一样,从博客评论的摘录中可以看出,这不是可行的解决方案:“非活动内存与往常一样高”。“当系统内存不足时,整个操作系统会挂起...”,“如果您消耗了mac的全部内存,则计算机可能会挂起”
总结起来,当内存仍然处于“非活动”状态时,我仍然不知道如何禁止Mac OS X使用交换功能。如果不可能,那么至少在某种程度上可以解释为什么osx倾向于换出可能随时从内存中释放的内存?