从Firefox 93开始,Firefox会监控系统可用的内存,当内存用量达临界点,浏览器即将崩溃之前,Firefox会借由卸载内存使用量大、但是用户未正在使用的分页,以确保Firefox的稳定性,卸载的分页会在用户下次需要时重新加载,页面的卷动位置和表单资料也都会恢复。这项功能会先在Windows上激活,接着会部署到macOS和Linux。
内存不足是导致Firefox浏览器和内容程序崩溃的主要原因之一,官方提到,卸载分页来节省Firefox内存使用量,对于避免软件完全崩溃是有效的手段,尤其是Firefox能够更好地应对在资源有限的机器上,打开许多分页的用例。
过去Mozilla就已经尝试在Windows上卸载分标签,但是一直无法在减少浏览器内存使用量,以及降低用户体验间找到平衡,因为重新打开分页会出现轻微延迟。
而Mozilla现在通过改进低内存检测和分页选择算法,来缩小卸载分页的影响范围。Mozilla在Nightly频道上进行一项相关实验,证实卸载分标签的确可以降低浏览器崩溃次数,在这为期一个月的实验,整体浏览器崩溃和内容程序崩溃明显减少,用户能够使用浏览器的时间更长。
但有趣的是,在实验中,研究人员也看到剩下的崩溃案例中,内存不足造成的崩溃比例增加,而且平均浏览器内存使用量增加。Mozilla以幸存者偏差来解释后者,提到高记忆使用率的浏览器,在过去会直接崩溃,但是现在能够在达到临界点之前,通过卸载分页来维持正常运行。
而对于内存不足崩溃比例增加,Mozilla并没有一个确定的答案,他们猜测可能在部分情况,启动分标签卸载为时已晚,因为像是卸载分标签需要对JavaScript堆进行垃圾回收,该操作需要额外的临时存储,因此导致分页直接崩溃而非被卸载。不过就整体而言,卸载分标签仍可以避免整个浏览器崩溃。
Mozilla提到,虽然他们会继续研究相关的问题,并且改进启发式方法,但是有鉴于该功能已经明显改善浏览器崩溃几率,因此他们仍然会在Firefox 93推出该功能。
由于卸载分页会干扰用户的浏览体验,因此Firefox只会在系统内存严重不足时,才会激活该功能避免崩溃。在Windows上,Firefox是通过操作系统的CreateMemoryResourceNotification,来获取物理内存量低下的信号,官方提到,虽然没有明确的物理内存低下阈值的数值,但约为6%,一旦发生这种情况,Firefox会开始定期检查内存提交空间。
当提交空间低于阈值时,Firefox便会卸载一个标签,当没有可卸载的分页,便会触发Firefox内部内存压力警示,降低浏览器子系统的内存使用量,Firefox会一直重复检查提交空间并且卸载分页,或是降低子系统内存用量的程序,直到内存提交空间高于阈值。
Mozilla解释,检查提交空间能够预测真正崩溃的时机点,由于只要有虚拟内存和物理内存可用,Firefox就能够继续运行,即便物理内存用完了,Firefox也仅是性能骤降,但是Firefox不会崩溃,但是在Windows上,只要提交空间不足,就算还有可用的物理内存,也会因为内存分配失败造成应用程序崩溃。
在理想情况中,Firefox会根据用户上次使用分页的时间,选择要卸载的分页,播放声音、子母画面(Picture-in-Picture)、置顶和使用WebRTC的分页权重较大,因此不太可能被Firefox卸载,前台的分页永远不会被卸载。
目前Firefox 93提供了一个卸载测试页面about:unloads,可供用户测试,目前这个功能还在测试阶段,会在Firefox 94发布时正式提供。
评论