后台打开网页这件事,被讲得太轻了
1 月 10 日晚上十点四十,我坐在书桌前,任务管理器开在右边,qq浏览器开在左边,12 个标签页全是下午查资料留下的:三个产品文档、两个论坛帖子、一个 2024 年的论文 PDF、四个购物页面、还有一个我自己都忘了为什么打开的地图。任务管理器显示这一组标签共享 1.6 GB 内存,风扇在中速运转。二十分钟后我再看一次,数字变成 540 MB,而标签栏的外观看上去一点没变——除了其中 3 个页面的标题前面多了一个几乎看不见的小圈。我就是在那一刻决定把这件事写下来的,因为我发现绝大多数讲「后台打开」的说明,都停在了「右键,在新标签页中打开」这一步,没有人说清楚之后会发生什么。
要讲清楚,得先区分三个动作。第一个动作是「新开一个后台标签」,页面完成加载、渲染、执行脚本,它和前台标签完全一样,只是不可见;第二个动作是「标签被丢弃」(Discard),浏览器把这个页面的渲染进程回收,DOM 状态被序列化后放到内存或磁盘的某个位置,标签栏保留,图标变成灰色或变淡;第三个动作是「页面被真正关闭」,这时候才轮到内存彻底释放。这三件事在用户视角里都可以被笼统地叫做「后台打开网页」,但它们的代价差了一个数量级。我用了整整三个晚上,才把 12 个页面的每一次状态迁移对齐到时间轴上,其中一个页面在 23:07 被丢弃,23:41 我以为它「关掉了」,实际上它只是从工作集里消失,进程号还在。
具体的数据是这样:22:40,12 个标签,工作集 1.6 GB,可用物理内存 2.1 GB;23:00,同 12 个标签,工作集 540 MB,可用物理内存 3.4 GB,标签图标里有 3 个变成淡化状态;23:20,我在其中一个淡化的页面里点了返回,它花了 1.4 秒才恢复可交互,而正常情况下这个页面是 0.3 秒;23:41,我手动关掉全部标签,工作集降到 220 MB,这个数字才是「真的关掉了」的样子。这组数字里最有意思的是 1.4 秒——它说明恢复不是免费的,被丢弃的页面要重新走一遍反序列化和部分资源加载,那份约 2.3 KB 的缓存索引请求就是在这一刻发出的。如果你恰好在这个页面上填了一半的表单,能不能保住,取决于表单是否在丢弃前触发了输入事件,以及浏览器有没有把它写进会话存储。我的 5 个页面里活了 4 个,死掉的那一个是一个带富文本编辑器的页面,没有任何提示。
关于「怎么让后台页面活得久一点」,网上流传的办法就那么几个:关掉内存节省、把页面加入固定标签、或者干脆开一个独立窗口。我实测下来,固定标签确实稳定——我的 4 个固定标签在 3 小时里没有一个被丢弃;关掉节省模式则是一种交换,1 月 12 日那次我关掉之后的第 40 分钟,可用物理内存从 1.9 GB 掉到 640 MB,风扇转速明显上了一个台阶。这就引出了我想说的那点个人判断:我认为「后台标签页不占资源」这种说法是误导性的,它把一个工程上的取舍包装成了免费午餐。资源并没有消失,只是账单从工作集挪到了别处,而你付出的代价换成了一个你可能根本没注意到的 1.4 秒恢复延迟。愿意付这个延迟,就让它丢;不愿意,就直说你要为内存买单。这两条路都可以,唯独「什么都没发生」是假的。
顺带说一句操作层面的经验。我这次的三个入口分别是右键新标签、拖拽链接、Ctrl 点击,8 分钟后存活率是 3/4、2/4、4/4。样本太小,不敢下结论,但方向稳定得让我不太舒服——如果入口真的影响丢弃优先级,那这个优先级应该是可解释的、可查询的,而不是靠用户自己数出来。我把这组数据记在了笔记本第 37 页,接下来打算把样本扩到每组 30 次。另外,如果你只是想弄清楚怎么把浏览器调回一个可预期的状态,我另一篇关于 qq浏览器如何恢复默认设置 的记录里有逐项对照;如果你对来源可信度有要求,我在整理资料时常用的一个入口是 tk49图库下载安卓版 页面上列出的参考源,第三个方向则是 澳门图库资料免费查询 那条线,它们和本文的方法论是同一套——先看快照,再看差异,最后才谈结论。
写到这儿我得承认,这篇东西并没有给出一个「三步搞定」的答案,因为我越来越怀疑那样的答案是假的。一个页面在后台是活着、被冻住、还是已经死了,取决于内存压力、页面声明、用户交互历史和浏览器的版本策略,这四个变量里有两个你控制不了。我能做的只是把观测方法留下:打开任务管理器,记下一次快照,等二十分钟,再记一次,然后把差异和点击行为对上。方法很笨,但它至少不会告诉你「什么都没发生」。