我一直在观看一集较早的碎片整理工具,其中 Andrew Richards 解释了 RAMMap (http://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-6-RAMMap)
在 24:45 时,他提到重新利用待机列表 5-7 表示系统内存压力很大。在本节目的评论中,他向一位拥有新笔记本电脑的用户证实了这一点。为了更好地理解这一点,我还观看了 Mark Russinovich 的《揭秘内存管理》。
待机被视为缓存,(在非 SSD Windows 7 安装中,SuperFetch 被隐式启用,它使用待机列表 6 和 7 将数据加载到待机列表中以使其准备就绪)
安德鲁甚至展示了他的机器的优先级摘要(25:50),该机器已经工作了数周,在 5-7 小时内没有重新利用内存。
与此说法相反,重新利用 5 似乎没有必要,因为存在内存压力问题。重新利用的一些解释如下:
这是我的 win 7 x64 的屏幕截图,配备 16 gb 内存的机器,运行了 1.5 天,只运行了 Firefox 和远程桌面。
由于 SuperFetch 已被禁用,因此 6 和 7 为空。
这是我们的一台进行数据处理的机器(基本上是一个应用程序在运行,消化数据)
根据安德鲁的解释,5 上重新利用的 800 GB 将表明“内存压力”。
根据这个说法,我的本地机器需要的内存远不止 16GB,数据处理器需要的内存“稍微”多一点。处理涉及写入许多文件,为其添加 128GB 的内存可能无济于事,尽管原始的重新利用数字表明并非如此。
那么优先级 5 上的高重新利用内存是否表明存在真正的内存压力,或者是否涉及更多指标来排除其他问题?
我编写了一个小程序,它可以推动优先级 5 的重新利用:一个 for 循环分配 3/4 的内存,并在至少两个线程中访问它。但这是一个综合情况,因为我的机器从顶部感觉没有压力。那天它运行了病毒扫描,Firefox 和远程桌面没有占用我的内存。
显而易见的事实:如果我分配 3/4 的 RAM,使用它,释放它,再次重新分配等,不待机列表被重新用作释放列表,然后进入释放列表,最后进入清零列表。不过,我还没有使用文件映射进行测试,因为文件映射更容易被缓存为任意内存块。
答案1
在我看来,关于重新利用优先级 5 的待机 RAM 必然是内存压力的标志的说法被夸大了。
现在,优先级 5 确实是交互式进程的默认优先级,并且您更愿意看到优先级较低的页面被重新利用,而不是优先级 5 的页面。
但是,如果空间不够怎么办?目前,在这个系统上,我总共有 3.2 GB 的优先级 5 待机空间,优先级 0-4 总共可能有 130 MB!(顺便说一下,SuperFetch 已关闭,因为我的操作系统磁盘有一个 SSD。)
还要记住,这些“重新利用”计数器是自启动以来累积的。我的系统自 3 月 12 日以来已经运行了将近一个月 - 算起来是 27 天,大约 230 万秒。在这段时间里,我显然已经从优先级 5 列表中重新利用了大约 230 GB。听起来很多!但重新利用一次只进行一页;一页是 4096 字节,所以只有大约 5600 万页。因此,作为长期平均值,我每秒重新利用大约 24 个优先级 5 页面。“重新利用”需要几十纳秒,所以我认为我可以忍受。
由于大多数台式机和笔记本电脑系统上的大部分 RAM 都被交互式进程所使用,而大多数其他进程大部分时间都很少执行,因此交互式进程比其他进程有更多的重新利用机会是合情合理的。
另一个因素是,虽然“重新利用”计数器是从启动时累积的,但该屏幕上的“待机”计数器仅显示这些子列表的当前大小。我们不知道自启动以来优先级 4 待机的平均数量,也不知道最高峰值是多少,或者任何如此详细。如果没有这些信息,“重新利用”计数器的意义就很难评估。
总而言之,我认为这个评论有一定的道理(因为优先级 5 待机的重新利用不如较低级别那么可取),但是优先级 5 的大量“重新利用”并不一定是用完并购买更多 RAM 的理由。
编辑添加:我对该视频还有其他一些问题,这些问题让我认为演讲者对这些问题的理解有些不完整 - 或者也许他没有考虑太多就说话了。这种情况确实会发生。