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

减少 Chrome 的内存占用量是该团队今年的首要任务之一。得益于 V8 的垃圾回收流程改进,我们已经将 Gmail 的内存用量最多减少了 45%,但这只是一个开始。我们接下来要开展的一项内存用量实验,就是针对标签页囤积者(比如我自己)。这称为标签页舍弃

并非所有打开的标签页都是使用的标签页。如果内存不足,Chrome 可能会舍弃不感兴趣的后台标签页。

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”中的“立即舍弃标签页”以触发标签页舍弃。此操作会舍弃列表中的最后一个标签页。您还可以点击列表中相应标签页对应的“舍弃”按钮,将其从列表中舍弃。已舍弃的标签页将带有“[Discarded]”前缀。

已舍弃标签页示例屏幕截图。

标签页舍弃功能会按以下顺序舍弃标签页

  • 内部页面,例如“新标签页”“书签”等
  • 很久以前选择的标签页
  • 最近选择的标签页
  • 在窗口中运行的应用
  • 固定标签页
  • 所选标签页

我们已在 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 VM 的状态。

序列化器概念屏幕截图

如果您使用的是 Android 或 ChromeOS,可能知道我们会主动终止后台标签页(与本文中介绍的标签页舍弃实验类似),以确保内存用量较低。我们解决此问题的方法存在一个问题,就是您的标签页会丢失 *所有* 状态。

当您再次对该标签页感兴趣时,我们就必须重新加载该标签页,而您之前与该标签页的所有互动都会丢失。标签页序列化器只是以一种方式来解决此问题,让您几乎可以恢复到之前的状态,而无需重新连接到网络。我们期待日后分享有关这项工作的更多信息。

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

我们很想知道此功能对您是否有用,以及我们可以如何改进它。欢迎试用并多多使用(尤其是标签页用量较大的朋友!),并在评论中告诉我们您的想法。:) 如果您在 crbug.com 上遇到任何 bug,也欢迎提交工单。