减少 Windows 8 中的运行时内存
诸如内存使用之类的基本要素是 Windows 8 的一项主要工程设计原则。在构建 Windows 8 的过程中,我们的目标是显著降低核心系统的整体运行时内存要求。这对每个人都有好处,在如今这样一种环境下尤其如此,因为人们需要同时运行越来越多的应用 程序,或者需要在只有 1GB 或 2GB 内存的系统上运行应用程序。我们在本博文中讨论的便携式计算机与我们在 2008 年 Windows 7 PDC 中讨论的便携式计算机完全相同:现成可用的、第一代具有 1GB 内存的基于 ATOM 的上网本。本博文由我们的性能团队的小组项目经理 Bill Karagounis 创作,详细介绍我们在减少内存占用方面所做的努力。--Steven
Windows 8 的运行时内存使用是确定 Windows 8 系统要求以及将承载 Windows 8 的大量设备类型的一个重要因素。如您所知,我们要在基于 SoC 的低功耗设备上交付完整的 Windows 8 体验。这就使得保留大量内存供多个并行应用程序使用并保持设备的整体响应能力变得更为重要。
一个不是特别显而易见的情况是,最大程度减少低功耗平台上的内存使用可延长电池寿命。这是怎么回事?在任何 PC 上,RAM 都在不断地消耗电能。如果操作系统使用大量内存,就会迫使设备制造商加入更多物理 RAM。主板上的 RAM 越多,它消耗的电能就越多,电池寿命就越短。有些情况下,平板设备上的额外 RAM 会使平板设备的电池寿命缩短数天,使您无法坐在咖啡桌前通过平板设备了解外面的世界。
内存使用目标
从一开始,我们对 Windows 8 设定的目标就是采用与 Windows 7 相同的系统要求。 我们知道如果我们做得更好,即使保持发布的要求相同,应用程序也会有更多的资源可以使用。回想起 2009 年“低端”硬件的样子,而现在再也找不到类似 256MB 内存模块这样的古董,会觉得很有意思。我们想要确保使用 Windows 7 时代的硬件的人们可以选择将其现有计算机轻松地升级到 Windows 8 并利用 Windows 8 提供的功能。根据我们从我们的性能测试基础结构中故意保留的旧式计算机得到的经验,我们还预计在 Windows 7 发布之前生产的许多计算机将能够运行 Windows 8。
Windows 8 的一项重要任务是在寻找机会减少现有功能消耗的内存以及整个主板消耗的内存的同时,为新功能腾出空间。Windows 8 很好地实现了我们自己设定的目标。
任务管理器中的内存使用比较
准确比较 Windows 8 与 Windows 7 内存使用的最简单的方法是将这两种操作系统同时安装在一台 1GB RAM 计算机上(最低操作系统 RAM 要求),然后在它们已经过多次重新启动并闲置一段时间后对其进行比较。
Windows 任务管理器通过其“正在使用”统计信息提供系统内存的主要视图(详情请参见本文档)。下面的图形比较了运行 Windows 7 和 Windows 8 的同一台计算机在闲置时的内存使用情况,这台机器是 Steven 在最近的 Build 大会主题发言时使用的上网本,已经用了三年多。
构成计算机的特定硬件、驱动程序的内存使用甚至是运行时间都会造成差异,因此不同计算机上的内存结果将有所不同(甚至同一计算机上的内存结果在不同时间也不尽相同)。尽管如此,还是可以看出,相对于 Windows 7 而言,Windows 8 在这方面做得更好一些。
为了使测试计算机上的操作更有趣,请转到设备管理器并禁用您的显示适配器(卸载图形驱动程序)。您绝不能像这样来运行计算机,但这可以给出更准确的 Windows 本身的内存使用估计值。通过禁用图形驱动程序,在闲置一段时间后,上述计算机的内存使用减少了 200MB。
注意:对于 Windows 8,其干净安装中还将包含扩展的 Windows Defender 技术,该技术首次纳入了完整的反恶意软件功能,根据 Jason 撰写的“保护您免遭恶意软件侵害”博文所述,该技术还针对内存和资源使用进行了优化。(Windows 7 的干净安装中不存在此功能,建议您添加安全软件。)
在 Windows 8 中腾出空间
我们进行了数百项特定更改来最大限度地减少 Windows 8 中的操作系统内存使用。在此我将介绍几个帮助大幅节省内存的特定领域。
内存组合
在评估典型的运行中 PC 上的 RAM 内容时,我们发现内存的许多部分都包含相同的内容。系统 RAM 之间冗余的数据副本使我们有机会减少内存占用,甚至是服务和操作系统组件的内存占用。
怎么会发生这种情况呢?应用程序有时会分配内存以供将来使用,并将其全部初始化为相同的值。应用程序实际上可能永远都不会使用该内存,因为用户可能永远都不会调用某些功能。如果多个运行中应用程序同时执行该操作,系统中将会出现冗余内存副本。
内存组合是一种方法,通过这种方法,Windows 可以在正常活动期间高效地评估系统 RAM 的内容,并找到所有系统内存之间的重复内容。然后 Windows 会释放重复内容,只保留单个副本。如果应用程序以后尝试写入内存,Windows 将为其提供一个专用副本。所有这一切都在内存管理器中悄悄进行,不会对应用程序造成影响。该方法可以释放数十至数百 MB 的内存(具体取决于同时运行的应用程序数量)。
服务更改和缩减
配置为始终运行的操作系统服务是环境内存使用的一个重要根源。在 Windows 8 规划过程中评估一系列操作系统服务时,我们决定删除其中的大量服务(13 个),将一组不同的服务改为“手动”启动,同时还使一些“始终运行”的服务切换为“按需启动”模式。在该模式中,操作系统中的“触发器”(如连接设备或网络地址可用)将导致发生以下情况:
- 服务启动。
- 服务执行其操作(可能是任何操作)。
- 服务闲置一段时间以确保没有任何其他需要执行的操作,然后
- 服务退出。
您会发现,在 Windows 8 中,即插即用、Windows Update 和用户模式驱动程序框架服务都是触发启动,而在 Windows 7 中,这些服务始终在运行。
当然,我们向 Windows 8 中添加了大量新功能(和新代码)。这些新功能的其中一部分打包为新服务的形式。在这些新服务中,只有两个是自动启动的;所有其他服务都是手动启动或触发启动。
使用更少的内存执行同一作业
在 Windows 运行应用程序和执行它自己的系统日常管理时,程序文件和数据会从磁盘加载到主内存中。在迄今为止的 Windows 7 和 Windows 8 开发过程中,我们分析了正常执行期间的内存段(页面)及其引用频率。这里要说的是,如果您要支付分配内存段的费用,最好经常使用(引用)它。如果您不经常 引用该内存但仍然需要它,则应将其与其他内容进行整合。
在我们发布 Windows 7 后不久,我们向多个低级别 Windows 组件应用了一种类似方法,这些组件可追溯到 NT 的早期(20 世纪 90 年代早期)。所做工作包括重建代码体系结构和更改数据结构以便将内存的“热”部分(频繁引用)与“冷”部分完全分离。通过紧密整合热项目,我们降低了整体 运行时内存开销。
考虑到随时可能发生的变化(低级别操作系统),我们希望尽早完成计划中的工作以便有足够的时间来应对变化。截至目前,这些变化在 Windows 8 上已有所体现,这是近两年来数千名 Microsoft 员工使用该产品完成其日常工作的结果。我们已经看到一致的成果表明普通计算机上的内存使用可降低数十 MB。
“桌面系统”的迟缓初始化
早在六月份,Steven 和 Julie 就首次介绍了 Metro 风格用户界面。我们预计许多使用平板电脑的人会在该环境中花费大量时间,通常是使用 Metro 风格应用程序。在那次的演示过程中,我们还演示了对于 Windows 8,您还可以引入您的现有应用程序,并在非常熟悉的桌面环境中使用它们。
从内存的角度来看,我们利用了这样一个事实,即,将会有一组设备,用户在使用这些设备时几乎所有时间都停留在沉浸式的 Metro 风格用户界面中。在这种情况下,Windows 8 只在必要时初始化桌面环境特有的操作系统组件。这是内存节约的另一个原因,可立即节约大约 23MB。(请注意,任务管理器在桌面系统中运行,因此上面显示的内存数字包括任务管理器开销。)
更精细的内存优先级划分
在确定应用程序和系统组件的内存分配的优先级方面,Windows 8 有更好的方案。这意味着,Windows 可以更明智地判断哪些内存应该保留,哪些内存应该立即移除。
例如,防病毒程序 (AV) 会在其他程序打开文件时对文件进行各种检查。AV 程序分配用来检查病毒签名的内存通常是一次性分配(不太可能会再次需要该特定内存)。在 Windows 7 中,该内存被视为与系统中的其他内存(例如,Microsoft Excel 的运行实例所分配的内存)具有相同优先级。如果内存变得稀缺,Windows 7 最终可能会移除帮助其他运行中应用程序(如 Excel)对用户做出响应的内存,这种情况下,这种做法不是保持系统响应能力的最佳选择。
在 Windows 8 中,任何程序都可以将内存分配为“低优先级”。这是向 Windows 发出的一个重要信号,也就是说,当存在内存压力时,Windows 可以移除该低优先级内存以腾出空间,而且不会影响维持系统响应能力所需的其他内存。
总的来说,我介绍了我们在减少 Windows 8 中的内存使用方面的理念和采取的方法。您已经看到了一些示例结果,我只是浅显地探讨了迄今为止我们在这方面所做的一些工程设计工作。我压根没有讨论的一件 事是 Windows 8 应用程序模型,以及为了使新的 Windows 8 应用程序“以更友好的方式使用内存”所做的流程生命周期更改。请在 //build/ 内容和将来的博文中查看这方面的信息,因为它也是颠覆性改造 Windows 过程中非常重要的一部分。
我们已经取得很大进展,但还不够。
--Bill Karagounis