在 Chrome 中捨棄分頁 - 節省記憶體的實驗

阿迪奧斯馬尼
Addy Osmani

減少 Chrome 的記憶體用量是這個團隊今年的首要任務之一。我們發現 V8 的垃圾收集程序改善了高達 45% 的記憶體用量,但這才才剛開始。下一項記憶體用量實驗是針對像我一樣的分頁愛好者 (例如我本人)。這就是「分頁捨棄」功能

並非所有開啟的分頁都會用到分頁。如果記憶體不足,Chrome 可以捨棄沒有興趣的背景分頁。

在 Chrome 46 以上版本中,你可以使用分頁捨棄功能做為實驗。

背景

雖然多數人一次只使用一個分頁,但每個開啟的分頁通常每個分頁大約會佔用 50 MB 左右。如果開啟 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」。大停權器旨在透過在自訂閒置時間後暫停分頁,藉此減少 Chrome 的記憶體和 GPU 用量。

停權者螢幕截圖。

與分頁捨棄功能類似,需要再次互動時,分頁也可以解除停權。優秀的 Suspender 會維持每個分頁的標題和網站小圖示,以暗色顯示暫停的分頁,使它隨時都能直接返回,以便隨時返回。

已暫停分頁的網站小圖示螢幕截圖。

我目前未使用的背景分頁已暫停,節省記憶體。我目前仍在使用 (GitHub 和 YouTube) 的分頁,但這些分頁仍會照常運作。

事實上,我們一邊開發分頁捨棄功能,一邊與 Great Suspender 擴充功能的作者聊天,很開心看到我們原生處理此問題的方式比擴充功能更有效,例如失去使用者的實際狀態。

未來改善項目:分頁序列化程式

定位器序列化程式是未來的開發成果,我們認為目前可大幅改善目前分頁捨棄方法的效率。它會接收 Chrome 分頁的內容,並將其「目前」狀態序列化為二進位 blob。這個二進位 blob 稍後可以反序列化為分頁。

序列化程式會將幾乎所有 Chrome、Blink 和 V8 的分頁序列化,需要妥善保留分頁 (一些 Chrome 擴充功能一直無法輕易解決這個問題)。序列化通常會有幾項常見的疑慮:DOM (內含大量 WebGL 和 Canvas)、CSS 和 V8 JavaScript VM 狀態。

Serializer 概念螢幕截圖

如果您使用 Android 或 ChromeOS,您可能已經知道 (類似本文提到的分頁捨棄實驗) 我們會主動終止背景分頁,確保記憶體用量較低。我們採取的因應措施是您的分頁會失去「所有」狀態。

當您再次對該分頁感興趣時,我們必須重新載入分頁,所有與它的互動都會遺失。分頁序列化程式正解決這個問題,使您幾乎能返回原先所在的網路,而不需要回到網路。我們期待日後能與您分享更多有關這項工作的資訊。

試用分頁捨棄功能,並與我們分享你的想法

我們想知道這項功能是否實用,以及可如何改善。歡迎試用這項功能,並嘗試不同功能 (特別是分頁愛好者!), 然後在留言區告訴我們您的想法。:) 如果在 crbug.com 上遇到任何錯誤,也歡迎提交支援單。