减少 Chrome 的内存占用是该团队今年的首要任务之一。由于 V8 对垃圾回收过程的改进,我们已经看到 GMail 的内存使用量减少了高达 45%,但我们才刚刚开始。我们接下来的内存使用实验之一针对的是标签页收藏者(比如我自己)。这称为舍弃标签。
在 Chrome 46 及更高版本中,标签页舍弃功能以实验形式提供。
背景
对于您已打开的每个标签页,我们的渲染程序进程通常需要每个标签页大约为 50MB,即使大多数人每次只使用一个标签页也是如此。如果您打开了 10 个标签页,则至少会占用 450MB 的内存来保持后台标签页的状态。随着时间的推移,这可能会有点麻烦。
我们的一个目标是减少您实际未使用的标签页占用的内存。通过在 Chrome 任务管理器中查看哪些标签页在占用系统内存,我实际上只是“使用”了以下一个或两个网站,而后台的其他标签页却没有使用。
这就是标签页舍弃有助于减少内存用量的地方。
舍弃未使用的标签页
借助标签页舍弃功能,Chrome 在检测到系统内存用量过低时,可以自动舍弃您不感兴趣的标签页。舍弃是什么意思?即使被舍弃的标签页也不会丢失我们已将其终止,但仍然会显示在 Chrome 标签栏中。如果您返回到已舍弃的标签页,则会在用户点击时重新加载该标签页。表单内容、滚动位置等的保存和恢复方式与在向前/向后导航标签页时相同。
我们还提供另一项新功能,允许在本地缓存所有标签页资源,该功能可与离线状态下舍弃标签页的功能完美配合。重新启用该标签页后,您可以选择重新加载之前通过网络加载的缓存版本。如需启用从缓存重新加载页面的功能,您可以在 chrome://flags/#show-saved-copy
下尝试另一个实验。
您可以立即试用标签页舍弃功能,方法是通过 chrome://flags/#enable-tab-discarding
启用该功能,然后重新启动 Chrome。您可以通过同一 Chrome chrome://flags
页面控制是否启用或停用该功能。
通过一个名为 chrome://discards
的新页面,您可以列出当前打开的标签页,我们会尝试与您分享一些数据分析,让您了解这些标签页对您来说有多有趣(我们认为多么有趣)。
如需测试该功能,您可以执行正常的浏览行为,直到系统进入低内存模式,或者点击“立即舍弃标签页”来触发 about:discards 舍弃的标签页。这样会舍弃列表中的最后一个标签页您也可以点击相应的“舍弃”按钮,从列表中舍弃特定标签页。已舍弃的标签页将带有 [弃用] 前缀。
舍弃标签页时,系统会按以下顺序舍弃标签页:
- 内部网页,如新标签页、书签等
- 很久以前选择的标签页
- 最近选择的标签页
- 在窗口中运行的应用
- 固定标签页
- 所选标签页
我们在适用于 Windows 和 Mac OS 的 Chrome Canary 版中启用了标签页舍弃实验,即将在 Linux 上实现。
灵感:嗨,超棒的吊带裤
如果您觉得标签页舍弃功能听起来很熟悉,那么这是因为您可能遇到过一些实用的 Chrome 扩展程序(例如 The Great Suspender),这些扩展程序为您提供了相对简单一些的扩展程序。Great Suspender 的目标是在自定义处于非活动状态的一段时间后挂起标签页,从而减少 Chrome 的内存和 GPU 占用量。
与舍弃标签页类似,当您需要再次与标签页互动时,可以取消暂停标签页。Great Suspender 会保留每个标签页的标题和网站图标,以变暗状态显示挂起的标签页,从而让用户可以随时直接返回这些标签页。
在后台未使用的标签页已挂起,从而节省内存。我仍在经常使用的标签页(GitHub 和 YouTube)仍然照常运行。
实际上,在开发标签页舍弃功能时,我们与 Great Suspender 扩展程序的作者进行了很好的交流,他们很高兴看到我们以原生方式解决此问题,其处理方式可能比扩展程序可能的效率更高,例如丢失用户操作的状态。
未来改进:标签页序列化器
标签页序列化器是一项未来的工作,我们认为可能会大幅改进我们当前的标签页舍弃方法。它会获取 Chrome 标签页的内容,并将其 *当前* 状态序列化为二进制 blob。此二进制 blob 稍后可反序列化为标签页。
序列化器将对 Chrome、Blink 和 V8 正确保留标签页所需的几乎所有内容进行序列化(解决这个问题的 Chrome 扩展程序过去一直无法轻松实现)。序列化包括常见的问题:DOM(包含大量 WebGL 和画布)、CSS 以及 V8 JavaScript 虚拟机的状态。
如果您使用的是 Android 或 ChromeOS,您可能会知道(类似于这篇博文中介绍的标签页舍弃实验)我们会主动终止后台标签页,以确保降低内存用量。我们解决此问题的方法在于,标签页会丢失其 *所有* 状态。
当您再次对该标签页表现出兴趣时,我们不得不重新加载该标签页,这样您与它之间的所有互动都将丢失。标签页序列化器解决了这个问题,无需返回网络即可恢复几乎与之前完全相同的内容。我们期待以后与大家分享有关这项工作的更多信息。
试用标签页舍弃功能,并与我们分享您的想法
我们很想知道此功能对您是否有用以及应该如何改进。赶快试用一下吧(尤其是标签囤积者!),并在评论中告诉我们您的想法。:) 如果您在 crbug.com 上遇到任何错误,请提交工单,我们将不胜感激。