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

Addy Osmani
Addy Osmani

減少 Chrome 的記憶體用量是團隊今年的首要任務之一。目前 V8 的垃圾收集程序經過改良,這已經可以將 GMail 記憶體用量降低最多 45%,不過這才剛起步而已。下一項在記憶體用量實驗中,其中一項是針對像我一樣的分頁化器進行實驗。名稱叫做「分頁捨棄」

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

Chrome 46 以上版本提供捨棄分頁功能的實驗功能。

背景

儘管多數使用者一次只使用一個分頁,您開啟的轉譯器程序通常在每個分頁大約需要 50 MB 的空間。如果您已經開啟 10 個分頁,其中至少有 450 MB 的記憶體只用於維持背景分頁狀態。一段時間後,這就會變得不太穩定。

每個分頁所需的記憶體容量

我們的目標之一是減少目前「並未」使用的分頁記憶體。如果在 Chrome 工作管理工具中查看哪些分頁消耗我的系統記憶體,我其實在「使用」下方其中一個網站,但背景中的其他分頁沒有使用。

記憶體需求工作管理員

這時就捨棄分頁,有助於降低記憶體用量。

捨棄未使用的分頁

捨棄分頁可讓 Chrome 在偵測到系統記憶體不足時,自動捨棄不感興趣的分頁。捨棄的意思是什麼?遺憾的是,被捨棄的分頁卻無法移到任何地方。系統會終止這個 API,但它仍會出現在 Chrome 分頁列上。如果您返回捨棄的分頁,該分頁會在點選時重新載入。表單內容、捲動位置等項目的儲存和還原方式與前/後分頁瀏覽時相同。

我們還提供另一項新功能,允許在本機快取所有分頁資源,適合在離線時捨棄分頁資源。重新啟用分頁時,您可以選擇重新載入先前透過網路載入的快取版本。如要啟用從快取重新載入網頁的功能,您可嘗試在 chrome://flags/#show-saved-copy 下執行其他實驗。

只要透過 chrome://flags/#enable-tab-discarding 啟用分頁,然後重新啟動 Chrome,就能立即捨棄分頁。您可以透過相同的 Chrome chrome://flags 頁面控制啟用或停用這項功能。

啟用分頁捨棄螢幕截圖功能。
重新啟動按鈕的螢幕截圖。

名為 chrome://discards 的新頁面可讓您列出目前開啟的分頁,並試著分享一些見解,讓您瞭解這些分頁對您有多大的吸引力 (由多到最重要)。

捨棄分頁頁面的螢幕截圖。

如要測試這項功能,您可以執行一般的瀏覽行為,直到系統處於低記憶體模式為止。或者,您也可以點選「立即捨棄分頁」,藉此觸發 Tab 捨棄的分頁。這會捨棄清單中最後一個分頁。您也可按一下特定分頁對應的「捨棄」按鈕,從清單中捨棄特定分頁。捨棄的分頁會顯示 [已捨棄] 前置字串。

捨棄分頁的範例螢幕截圖。

分頁捨棄分頁會依以下順序捨棄分頁:

  • 新分頁、書籤等內部頁面
  • 很久以前選取的分頁
  • 最近選取的分頁
  • 在視窗中執行的應用程式
  • 固定分頁
  • 所選分頁

我們已啟用 Windows 版和 Mac OS 的 Chrome Canary 中的捨棄分頁實驗功能,不久後就會推出 Linux 實作項目。

系統在判斷是否要捨棄分頁時,也會將固定分頁納入考量

靈感:哈囉,有很棒的停下來

如果您捨棄分頁,這是因為您可能會發現許多實用的 Chrome 擴充功能,可為這個概念提供稍微簡化的版本,例如「The Great Suspender」。大暫停服務的目的是在自訂閒置期間後暫停分頁,以減少 Chrome 的記憶體和 GPU 佔用空間。

暫停使用螢幕截圖。

與分頁捨棄類似,您可以在需要再次與分頁互動時,將分頁解除停權狀態。Great Pauseer 可保留每個分頁的標題和網站小圖示,並以暗色狀態顯示暫停的分頁,方便隨時返回返回至分頁。

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

系統在背景中未使用的分頁已停止運作,節省了記憶體。但我仍在使用的分頁 (GitHub 和 YouTube) 仍會照常運作。

事實上,我們在開發分頁捨棄分頁的同時,與 Great Suspender 擴充功能的作者進行了良好對話,他們很高興看到我們以比擴充功能更有效率的方式處理這個問題,例如失去使用者操作的狀態。

日後改善:分頁序列化程式

分頁序列化程式是日後推出的一項工作,我們認為可大幅改善目前的分頁捨棄功能。它取得 Chrome 分頁的內容,並將其「目前」狀態序列化為二進位 blob。這個二進位 blob 之後可以反序列化為分頁標籤。

序列化程式會將幾乎所有 Chrome、Blink 和 V8 內容序列化,才能妥善保留分頁 (Chrome 擴充功能過往無法輕易解決這項問題)。序列化會包含常見因素:DOM (包含大量 WebGL 和 Canvas)、CSS 和 V8 JavaScript VM 的狀態。

序列化程式概念螢幕截圖

如果您使用的是 Android 或 ChromeOS,或許會知道 (與本文所述的分頁捨棄實驗功能類似),我們會主動終止背景分頁,以確保記憶體用量偏低。解決方式的問題在於分頁會失去「所有」狀態。

再次對該分頁表示興趣後,我們必須重新載入分頁,就會遺失您與這個分頁的所有互動。分頁序列化程式就是能直接復原這個問題,無需返回網路。我們日後會再分享更多有關這項工作的資訊。

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

我們想知道這項功能是否實用,以及應該如何改善。不妨試試這個功能,看看有什麼新想法 (特別是分頁迷!) 並分享您寶貴的意見。:)。也歡迎您針對在 crbug.com 遇到的任何錯誤提交支援單。