Firefox 93 中的标签卸载

从 Firefox 93 开始,Firefox 将监控可用的系统内存,如果系统内存变得极低,以至于即将崩溃,Firefox 将通过卸载内存占用量大但未积极使用的标签来进行响应。此功能目前已在 Windows 上启用,并将随后部署到 macOS 和 Linux。当标签被卸载时,标签将保留在标签栏中,并在下次选中时自动重新加载。标签的滚动位置和表单数据将像浏览器使用“恢复上一个窗口”选项重新启动时那样恢复。

在 Windows 上,内存不足 (OOM) 情况是我们用户报告的大量浏览器和内容进程崩溃的原因。卸载标签允许 Firefox 节省内存,从而减少崩溃并避免使用浏览器的相关中断。

我们相信这可能特别有利于在资源受限的机器上使用大量标签进行大量浏览工作的人。或者也许是那些只想玩内存密集型游戏或使用运行起来有点疯狂的网站的用户。当然,还有那些标签囤积者(这里没有判断)。Firefox 现在能够更好地应对这些情况。

我们之前曾在 Windows 上尝试过标签卸载,但我们无法克服的一个问题是,在降低浏览器内存使用率和惹恼用户之间找到平衡点是一项相当困难的任务,因为标签重新加载时会有一点延迟,而且我们从未得到令人满意的结果。

我们现在通过改进我们的低内存检测和标签选择算法,并将操作范围缩小到我们确定可以为用户带来益处的案例,再次解决了这个问题:如果浏览器即将崩溃。最近,我们一直在 Nightly 频道上进行一项实验,以监控标签卸载对浏览器使用情况和用户遇到的崩溃次数的影响。我们从该实验中看到了令人鼓舞的结果。我们将继续监控结果,因为此功能将在 Firefox 93 中发布。

通过在 Nightly 频道上进行的实验,我们希望看到用户遇到的 OOM 崩溃数量减少。但是,在一个月的实验之后,我们发现浏览器崩溃和内容进程崩溃总体上大幅减少。在剩余的崩溃中,我们发现 OOM 崩溃有所增加。最令人鼓舞的是,启用标签卸载的用户能够更长时间地使用浏览器。我们还发现浏览器的平均内存使用量有所增加。

后者看起来可能非常违反直觉,但很容易解释:幸存者偏差。就像二战期间盟军轰炸机上带有弹孔的典型例子一样,过去会崩溃的内存使用量非常高的浏览器会话现在能够通过在达到临界阈值之前卸载标签而幸存下来。

OOM 崩溃增加也令人非常违反直觉,更难解释。在引入标签卸载之前,Firefox 已经通过触发内部内存压力事件来响应 Windows 内存压力,从而允许子系统减少其内存使用量。使用标签卸载,该事件将在所有可卸载标签都被卸载后触发。

这可能解释了差异。另一个假设是,我们的标签卸载有时启动得过晚,发现标签处于无法安全卸载的状态。

例如,卸载标签需要对它的 JavaScript 堆进行垃圾回收。这需要一些额外的临时存储空间,而这些空间不可用,导致标签崩溃而不是被卸载,但仍然可以保存整个浏览器免于崩溃。

我们正在努力提高我们对这个问题和相关启发式方法的理解。但是鉴于用户明显改善的结果,我们认为没有必要再延迟发布此功能。

Firefox 何时会自动卸载标签?

当系统内存极低时,Firefox 将开始自动卸载标签。卸载标签可能会影响用户的浏览会话,因此该方法旨在仅在必要时卸载标签,以避免崩溃。在 Windows 上,Firefox 会收到来自操作系统的通知(使用CreateMemoryResourceNotification 设置),指示可用的物理内存正在减少。低物理内存的阈值没有记录,但似乎约为 6%。一旦发生这种情况,Firefox 将开始定期检查提交空间(MEMORYSTATUSEX.ullAvailPageFile)。

当提交空间达到低内存阈值时,该阈值由首选项“browser.low_commit_space_threshold_mb”定义,Firefox 将卸载一个标签,或者如果没有可卸载的标签,则会触发 Firefox 内部内存压力警告,从而允许浏览器中的子系统减少其内存使用量。然后,浏览器会等待一小段时间,然后再检查提交空间,并重复此过程,直到可用的提交空间超过阈值。

我们发现对提交空间进行检查对于预测何时会出现真正的内存不足情况至关重要。只要仍然有交换空间和物理内存可用,就不会有问题。如果我们用完了物理内存,并且有交换空间,性能会因为分页而下降,但我们不会崩溃。

在 Windows 上,即使有物理内存可用,如果系统中的提交空间不足,分配也会失败,应用程序也会崩溃,因为 Windows 不会过度分配内存,在这种情况下,它可能会拒绝将虚拟内存分配给进程。换句话说,与 Linux 不同,Windows 始终需要提交空间才能分配内存。

我们是如何最终陷入这种困境的?如果某些应用程序分配了内存,但没有访问它,Windows 不会将物理内存分配给此类未访问的内存。我们观察到图形驱动程序执行此操作,导致在有大量物理内存可用时交换空间不足。

此外,我们收集的崩溃数据表明,使用高性能机器的许多用户都处于这种情况,有些人可能认为由于他们的机器上有大量内存,因此可以将 Windows 交换空间减少到最低限度。你可以看到为什么这不是一个好主意!

Firefox 如何选择首先卸载哪些标签?

理想情况下,只有不再需要的标签才会被卸载,用户最终会重新启动浏览器或关闭已卸载的标签,而不会重新加载它们。一个自然的度量标准是考虑用户上次使用标签的时间。Firefox 按最不经常使用的时间顺序卸载标签。

播放声音、使用画中画、固定标签或使用 WebRTC(用于视频和音频会议网站)的标签的权重更高,因此它们不太可能被卸载。前台的标签永远不会被卸载。我们计划进行更多实验并继续调整算法,旨在减少崩溃,同时保持性能并对用户保持谨慎。

about:unloads

为了诊断和测试目的,已添加了一个新页面 about:unloads,用于显示标签的卸载优先级顺序,并手动触发标签卸载。此功能目前处于测试阶段,并将随 Firefox 94 一起发布。

Screenshot of the about:unloads page in beta planned for Firefox 94.

计划在 Firefox 94 中测试的 about:unloads 页面的屏幕截图。

浏览器扩展

某些浏览器扩展已经为用户提供了卸载标签的功能。我们预计这些扩展将与自动标签卸载协同工作,因为它们使用相同的底层tabs.discard() API。虽然它可能在将来发生变化,但目前自动标签卸载仅在系统内存极低时发生,这是一个低级系统指标,WebExtensions API 无法访问。(注意:扩展可以使用 WebExtensions API 中的本机消息支持 使用单独的应用程序来实现这一点。)用户仍然可以从标签卸载扩展中获益,这些扩展可以提供更多关于何时卸载标签的控制,或者使用更激进的启发式方法来节省更多内存。

请通过在ideas.mozilla.org 上留下反馈或报告错误 来告诉我们它的工作原理。如需支持,请访问support.mozilla.org。Firefox 崩溃报告和遥测遵守我们的数据隐私原则。有关更多信息,请参阅Mozilla 隐私政策

感谢 Gian-Carlo Pascutto、Toshihito Kikuchi、Gabriele Svelto、Neil Deakin、Kris Wright 和 Chris Peterson 对这篇博文的贡献,以及他们对开发 Firefox 中的标签卸载所做的工作。

关于 Haik Aftandilian

更多由 Haik Aftandilian 撰写的文章…


19 条评论

  1. Uristqwerty

    作为经常使用长期存在的标签的用户,我的一些想法

    – 许多网站在您打开页面时会显示正在积极变化的内容的快照,因此能够使用该标签的原始响应集进行恢复将是一个有价值的选项(请考虑:在 6 个小时内多次打开某个网站的首页。如果它们都重新加载为彼此的克隆,那么就是浏览状态的损失)。我不知道这是否已经是这样,但如果不是,这将是一个需要考虑的事情。

    – 通常,用户交互会以无法自动恢复的方式更改页面状态(例如,折叠/展开回复),因此,优先卸载没有用户交互时间或没有 DOM 更改的选项卡的启发式方法也有助于保留不可恢复的状态。

    – 如果没有其他方法,用于决定应该首先卸载哪些选项卡的扩展程序 API 最终可以允许用户选择,例如“即使在前景选项卡中也要卸载 youtube;它既占用大量资源又可以很好地保留其自身状态”,或者“最好不要卸载 reddit,它绝对*不是*幂等的”,或者工具栏上的切换按钮“我关心这个特定的选项卡实例;无论如何都要保持它加载”。或者更好的是,“不要卸载名为“重要”的容器中的选项卡”,重新使用用户可能熟悉的 UI,而不是要求他们学习新的东西。将其留给扩展程序将允许它们根据不同的技术专业知识水平进行调整,而不是单个 UI 妥协。

    总的来说,听起来对许多用户来说都是一个不错的功能。

    2021 年 10 月 5 日 上午 12:53

  2. Bela

    在这方面,我最希望的就是让“在背景选项卡中打开”创建*已经卸载*的选项卡。即仅仅是打开到指定 URL 的选项卡的概念。我习惯于打开一个满是文章的网站,然后按住 Ctrl 键点击其中十几个文章进入背景。这会导致一连串完全不必要的活动,因为我一段时间内不会查看任何这些选项卡。

    注意:*不是*要求减慢后台选项卡的加载速度。我不想让资源慢慢消耗,我想要它们根本不消耗。直到我通过*切换*到该选项卡为止。

    同样,从保存的会话重新启动时,也不要加载除焦点选项卡之外的任何选项卡。

    显然,这必须是一个选项,因为许多用户会讨厌它。重度选项卡用户会喜欢它。

    2021 年 10 月 5 日 下午 18:50

    1. Haik Aftandilian

      @Bela,有一个可用的扩展程序可以以卸载状态打开新选项卡,因此可能值得尝试一下。看看 Lazy Tabs

      https://addons.mozilla.org/en-US/firefox/addon/lazy-tabs/

      我测试了最新版本,最后更新时间是 2021 年 7 月 3 日,它按预期工作。它是一个小扩展程序,可以轻松阅读整个源代码以查看它的作用。

      2021 年 10 月 5 日 下午 20:41

      1. Reik Red

        我只是想表达我对 Bela 上面描述的“即时”选项卡加载的支持。重要提示:尽管必须加载网站图标。网站图标是视觉导航的重要帮助。

        (大约在 Firefox 60(??)的时候,由于在 Firefox 新版本中实施的新安全策略,我丢失了所有网站图标,这导致大量麻烦,不得不重新访问数千个选项卡以尝试重新显示网站图标。内存也耗尽了!不过我离题了。)

        即时选项卡加载可以是用户可选的功能。当您切换到选项卡时,该选项卡可能会显示“即时加载正在进行中”,直到从网络(*如果无网络则从缓存*)中获取/呈现内容为止。

        我刚刚尝试了上面链接的 Lazy Tabs 应用程序,它根本没有达到我想要的效果。您必须手动进入并暂停(卸载?)每个选项卡。这与即时加载完全不同。

        2021 年 10 月 7 日 上午 13:17

    2. moose

      有趣的是,我想要相反的效果。我想要加载一大堆选项卡,然后在我不使用互联网时(例如在飞机上……)让它们可用(并且*不*被卸载)。

      同样,我绝不想因为/Firefox/(而不是特定页面)决定重新加载或对我的其中一个选项卡进行任何操作而不得不重新连接到互联网。(在我的移动设备上尤其令人讨厌,因为我拥有足够的 RAM 无需担心,但我不想打开移动数据或其他任何操作。或者我想在无法连接到互联网时阅读一些内容(例如在飞机上)。重新加载/刷新选项卡会丢失上下文,并可能导致页面不再存在。)

      2021 年 10 月 5 日 下午 23:52

      1. Gian-Carlo Pascutto

        文章提到的要点(但显然没有很好地表达出来 :-/)是,当我们即将因内存不足而崩溃时,我们会触发这种情况。因此,我们的选择是尝试选择一个选项卡卸载,或者崩溃——这会卸载所有选项卡。因此,选项卡卸载对您的情况是有帮助的,而不是有害的。

        2021 年 10 月 7 日 上午 05:56

    3. Reik Red

      我只是想表达我对 Bela 上面描述的“即时”选项卡加载的支持。重要提示:尽管必须加载网站图标。网站图标是视觉导航的重要帮助。

      (大约在 Firefox 60(??)的时候,由于在 Firefox 新版本中实施的新安全策略,我丢失了所有网站图标,这导致大量麻烦,不得不重新访问数千个选项卡以尝试重新显示网站图标。内存也耗尽了!不过我离题了。)

      即时选项卡加载可以是用户可选的功能。当您切换到选项卡时,该选项卡可能会显示“即时加载正在进行中”,直到从网络(*如果无网络则从缓存*)中获取/呈现内容为止。

      我刚刚尝试了上面链接的 Lazy Tabs 应用程序,它根本没有达到我想要的效果
      我想要的效果。您必须手动进入并暂停(卸载?)每个选项卡
      手动。这与即时加载完全不同。

      2021 年 10 月 7 日 上午 13:24

  3. Cookie Engineer

    太棒了!

    关于选项卡囤积问题的评论:我们可以获得一个能够搜索书签的 html/文本内容的本地搜索页面吗?

    人们通常害怕丢失选项卡,因为万能地址栏对于查找书签中的内容毫无用处。一个专用的搜索页面(about:search?),它使用书签 URL、标签和更重要的内容的本地索引,将非常有助于重新发现阅读列表或之前已经收藏的选项卡。

    也许自动存档书签的阅读视图,并将其用作搜索的基线?

    2021 年 10 月 5 日 下午 20:56

    1. zakius

      曾经有一个易于访问的库(Ctrl+Shift+B),但它太简单了

      2021 年 10 月 6 日 上午 03:23

    2. Reik Red

      我喜欢“在所有打开的选项卡中进行全页面(正则表达式)文本搜索”的想法,无论是在本地还是其他地方。也许本地更好——我可能不喜欢告诉 Google 我打开了 1000 个选项卡,以便它可以将搜索限制在这些选项卡中,即使 Google 支持这样的概念。

      关于选项卡囤积的总体情况:我囤积选项卡的原因之一是,在书签或历史记录中搜索等操作不会提供我查看过的相邻选项卡的上下文,这些选项卡与我收藏的某个特定选项卡相关,即使所有选项卡都被收藏了(希望这句话有意义)。

      2021 年 10 月 7 日 上午 13:01

  4. zakius

    “卸载”绝对应该将当前状态卸载到非易失性存储器中,有太多情况从网络重新加载根本行不通,尤其是对于这些资源密集型网站
    并且始终存在当您的连接断开时返回到已卸载选项卡的边缘情况

    2021 年 10 月 6 日 上午 02:38

  5. martixy

    > 令人惊讶的是,大量使用功能强大的机器的用户都遇到了这种情况,有些人可能认为,由于他们在机器中拥有大量内存,因此可以将 Windows 交换减少到最低限度。

    这并不奇怪。虚拟化内存是一个难以理解的概念。

    值得注意的是,Windows 可以设置最小和最大页面文件大小。这样,您就可以同时拥有小型页面文件和用于虚拟提交的空间。不过,我希望 Windows 能够允许过度提交。

    2021 年 10 月 6 日 上午 03:08

  6. Janio Sarmento

    很棒,但我认为 Firefox 应该对其 JS 引擎进行现代化改造,而不是解决那些不那么重要的问题。

    我每天使用 Firefox 的次数越来越少,因为我使用的一些工具(例如 Proxmox)由于缺乏对现代 JS 功能的支持而无法在其中使用。令人沮丧。

    2021 年 10 月 6 日 上午 03:32

  7. Dan

    Web 浏览器应该停止成为操作系统,这直接违背了 KISS 原则,过去最好的技术(例如 Unix)就是基于此原则构建的。
    我们需要一个新的模型来运行互联网时代的应用程序,该模型不涉及 DOM、JavaScript 等糟糕的技术,以及使用 HTML 和 CSS 等标记语言来构建应用程序。如今的 Web 应用程序比 Windows 3.11 时代的应用程序速度更慢,响应性更差。

    2021 年 10 月 6 日 上午 09:53

  8. Dmitry

    那么,我如何禁用此选项?

    我将解释我的观点。我积极使用互联网和计算机。我经常打开许多选项卡和程序。但是,我会在任务管理器中独立监控可用内存,并且可以独立关闭占用内存但不再需要的选项卡或程序。但是,我需要选项卡不要从内存中卸载。我不想遇到这样的情况,因为邮件选项卡已卸载,我无法收到邮件通知。我不想丢失一小时前在网站表单中输入的文本。我不想丢失来自我的即时通讯工具的通知。即使我的计算机进入 SWAP 并开始转储到页面文件,我也不会遇到任何问题,因为我拥有 SSD。但我希望我的选项卡始终保持最新状态。
    那么,我如何禁用这个该死的选项?

    2021 年 10 月 7 日 上午 00:37

    1. Haik Aftandilian

      Firefox 尝试仅在即将发生内存不足崩溃时才卸载选项卡。大量交换不应触发选项卡卸载。当交换文件空间几乎耗尽时,这种情况更有可能发生。但是,您可以通过在 about:config 中将“browser.tabs.unloadOnLowMemory”设置为 false 来禁用选项卡卸载。您禁用它的方式将来可能会发生变化。如果您保留它并遇到在您认为没有内存不足崩溃风险的情况下选项卡被卸载,请通过在 https://bugzilla.mozilla.org 上提交错误报告来告知我们。

      2021 年 10 月 7 日 下午 14:09

  9. Reik Red

    (上面不小心提交了半写好的评论,请删除该评论,如果需要,也请删除此评论)

    选项卡卸载是一个很棒的想法。我迫切地期待着 Linux 版本启用选项卡卸载。

    不过,还有一些额外的功能将很有用。

    1. 通过 about:config 为每个 Firefox 实例单独设置用户定义的内存限制。达到限制时,调用选项卡卸载

    2. 与 1 相同,但使用全局限制来限制为用户或所有用户运行的所有 Firefox 实例(配置文件)
    (不太重要)。

    我也很喜欢 Bela 在上面提到的关于只有在标签页被显示(选中,可见打开)在窗口中时才加载标签页内容的评论。但是仍然在标签页中显示收藏夹图标,这样更容易找到相关的标签页。我很久没有尝试过“延迟加载标签页”了。一些以前(可能无关)的延迟加载标签页版本并不那么好。大约两年前,在 Firefox 大规模提速之后,我对加载时间或浏览器重启时间总体上不太担心,但现在即使在重启之后我的内存使用量也非常高,因此像延迟加载标签页这样的内置功能除了卸载标签页之外非常有用。

    为了让您了解我的内存使用情况,这里有一个名为 reikHH 的实例/配置文件,它大约有 12GB 的内存,包含 1620 个标签页,这是我所有配置文件中每个标签页使用的内存最多的一個 :)

    FirefoxHH -P reikHH
    mapped: 12395992K writeable/private: 5793320K shared: 839428K

    上面的内存占用来自我找到的 pmap 脚本(linux)。

    2021 年 10 月 7 日 下午 12:46

    1. Reik Red

      说明:我开始在评论中使用“即时标签加载”这个词,而不是“延迟加载标签页”。按需加载可能是另一个描述它的术语。

      2021 年 10 月 7 日 下午 13:20

  10. Joel Crumpler

    很棒

    2021 年 11 月 4 日 上午 07:38

这篇文章的评论已关闭。