2.5 Windows 8 Metro应用内存回收机制
Windows 8 权威指南
微软在新一代的Windows 8中引入了全新的Metro界面,在Metro界面中拥有许多应用程序。针对这些应用的功耗问题,微软采取了特别优化策略,即应用被挂起之后,并不会使用CPU,从而使CPU进入低功耗状态,这时暂停的应用则会被保存在内存之中。本节将简要介绍Metro应用的内存回收机制。
首先来看看被保存在内存之中暂停的Metro应用。Metro应用与桌面应用程序不同,不管是否在前台显示,它经常会处于挂起的状态。当Metro应用程序挂起,它就在内存中处于保持的状态。可以打开任务管理器,在资源管理器中查看Metro应用的挂起,如图2.18所示。
图2.18中被黑框框起来的为Metro应用程序,可以发现在它们被挂起来之后,CPU的使用率为0,而且它们都只占用了少部分的内存。从中可以看出,若电脑没有内存压力就可以让更多的Metro应用处于挂起状态。
接下来我们来看看Metro应用在暂停的情况下其内存回收机制。从Windows 8的消费者预览版开始,我们就可以将挂起的Metro风格应用程序的整个工作集写入磁盘,以便当系统检测到压力的时候可以获取更多的内存。(这个过程与使特定的应用程序休眠然后再切换回恢复时类似),我们利用Metro风格的应用程序的挂起/回复机制来清空或者重新填充应用程序的工作集。
下面我们详细介绍一下事件发生的顺序。
第一步,进程生命管理器(PLM)检测系统中的内存压力并要求内存管理器(MM)清空承载已挂起的Metro风格应用程序的特定进程工作集,如图2.19所示。
第二步,MM将内存从应用程序工作集转移到操作系统的已修改页面列表(其中列出在重用之前其内容已被写入磁盘的内存),如图2.20所示。
第三步,已修改页面列表上的工作集页面将根据常见的策略异步写出(在后台伺机写出,当面临内存压力时触发写出),如图2.21所示。
第四步,即使将挂起应用程序的工作集写入磁盘,从进程中删除的内存页也仍保留在操作系统的备用列表中。这是在必要时可调整用途供其他应用程序使用的有用内存页的缓存。如果原始进程立即再次需要这些页面,则它们会被迅速移回原处,如图2.22所示。
如果用户在应用程序的工作集页面仍位于物理内存(位于已修改页面列表或备用列表)中时切换回该应用程序,页面将立即重新添加到应用程序的进程中。如果它们不再可用,Windows将以经过优化的方式从磁盘读入应用程序的工作集。
现在让我们来看看内存回收在实际中的应用。为了亲自体验其工作方式,我们使用运行的实例来演示内存回收的应用。
在RAM为2GB的电脑上运行多个Metro风格应用程序,这些Metro风格应用程序在后台运行,因此Windows将它们挂起。然后,我开始打开更多应用程序,以便推高系统上的内存使用率并触发该新功能。
在图2.23中,您将注意到,我打开了一些应用程序以造成更大内存压力并促使发生前面介绍的行为。显而易见,Windows清空了挂起的Metro风格应用程序的工作集(突出显示)。
从图2.23中可以观察到,Metro风格的应用程序的工作集已经清空,此时我们来比较一下原来的Metro风格应用程序“之前”和“之后”的工作集(由于任务管理器空间不足,无法显示全部27个已启动的应用程序,因此看不到有些“之后”的统计数据)统计结果,如表2.1所示。
可以看出,在此示例中,我们释放了超过250 MB的物理RAM供其他应用程序使用,而没有关闭挂起的应用程序。
针对此新功能的测试是在挂起的应用程序的工作集内容被清空后,您决定切换回该应用程序时它的响应速度。在运行此测试时,我使用了“Video”应用程序作为响应速度指标。“Video”应用程序既可以显示歌曲的歌词,又可以播放音乐视频。当“Video”应用程序进入后台时,它会挂起,从而停止播放。
将内存使用率推高到工作集被清空的程度后,我打开了更多应用程序并使用了系统一段时间,以确保切换回该应用程序时从磁盘读取工作集。然后,我执行了回到Video应用程序的操作,如图2.24所示。
我要查看的主要指标是,从执行回到该应用程序的操作到我能够再次听到声音需要多长时间。在配置低端电脑上,由于内存负载较重,从磁盘读取工作集的应用程序与工作集仍然位于内存中的应用程序相比,切换回它们时的响应速度没有明显区别。但实际效果仍将有所不同:工作集越大,从磁盘读入的时间就越长。
每个拥有释放版本的人都可以亲自尝试此功能。只需打开一些Metro风格应用程序和桌面应用程序以产生一定的内存压力,然后切换回已清空其工作集的已挂起Metro风格应用程序即可。