在 Chrome 中舍弃标签页 - 节省内存的实验

艾迪·奥斯曼
Addy Osmani

减少 Chrome 的内存占用量是该团队今年的首要任务之一。由于 V8 的垃圾回收过程的改进,我们已经看到 Gmail 的内存使用量减少了多达 45%,但我们才刚刚开始。我们接下来会开展的一项内存使用实验针对的是标签页收集者(比如我自己)。这一功能称为舍弃标签页

并非所有打开的标签页都被用作标签页。如果内存不足,Chrome 可能会舍弃不感兴趣的背景标签页。

在 Chrome 46 及更高版本中,标签页舍弃功能是一项实验性功能。

背景

对于您打开的每个标签页,即使大多数人一次只使用一个标签页,我们的渲染程序进程通常也会占用大约 50MB 的内存。如果您打开了 10 个标签页,则至少要花费 450 MB 的内存才能保持后台标签页状态。随着时间的推移,这可能会有点麻烦。

每个标签页所需的内存

我们的目标之一是减少实际并未使用的标签页上使用的内存。如果我在 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 和 Canvas)、CSS 以及 V8 JavaScript 虚拟机的状态。

序列化器概念屏幕截图

如果您使用的是 Android 或 ChromeOS,那么您可能已经知道,为了确保较低的内存用量,我们会主动终止后台标签页(类似于本博文中介绍的标签页舍弃实验)。我们处理该问题的方式存在一个问题,那就是您的标签页会丢失其 *所有* 状态。

当您再次对该标签页表现出兴趣时,我们必须重新加载它,您的所有互动都会丢失。标签页序列化器就是为了解决此问题,它使您无需返回到网络,即可让您几乎完全回到之前的操作。我们期待日后分享有关这项工作的更多信息。

试试舍弃标签页功能并告诉我们你的想法

我们很想知道此功能是否对您有用及如何改进。欢迎试用并体验一下(尤其是喜欢标签页收藏的用户!),并在评论中告诉我们您的想法。:) 如果您在 crbug.com 上针对遇到的任何 bug 提交工单,我们将不胜感激。