Chrome でタブが破棄される - メモリ節約のテスト

Chrome のメモリ使用量の削減は、今年のチームの最優先事項の一つです。V8 のガベージ コレクション プロセスの改善により、Gmail のメモリ使用量はすでに最大 45% 削減されていますが、これはまだ始まりにすぎません。メモリ使用量に関する次のテストの 1 つは、タブを大量に開いているユーザー(私のような)を対象としています。これはタブの破棄と呼ばれます。

開いているタブがすべて使用されているタブとは限りません。メモリ不足になると、Chrome は興味のないバックグラウンド タブを破棄することがあります。

タブの破棄は、Chrome 46 以降で試験運用版として利用できます。

背景

通常、レンダラ プロセスでは、開いているタブごとに約 50 MB の使用量が発生します。ただし、ほとんどのユーザーは一度に 1 つのタブしか使用しません。10 個のタブを開いている場合、バックグラウンド タブの状態を維持するだけで少なくとも 450 MB のメモリが消費されます。時間が経つにつれて、少し扱いづらくなる可能性があります。

タブあたりに必要なメモリ

実際に使用していないタブで使用されるメモリを削減することも、Google の目標の一つです。Chrome のタスク マネージャーでシステムメモリを使用しているタブを確認すると、実際には以下のサイトの 1 ~ 2 つしか「使用」しておらず、バックグラウンドの他のタブは使用されていません。

メモリ要件のタスク マネージャー

タブの破棄は、メモリ使用量を削減するのに役立ちます。

使用していないタブの破棄

タブの破棄により、システム メモリがかなり不足していることが検出されると、Chrome はユーザーにとって重要でないタブを自動的に破棄します。破棄とは破棄されたタブはどこにも移動しません。タブは終了されますが、Chrome のタブバーには引き続き表示されます。破棄されたタブに戻ると、クリックしたときに再読み込みされます。フォームのコンテンツやスクロール位置などは、タブの前後に移動する場合と同じように保存および復元されます。

また、すべてのタブ リソースをローカルにキャッシュに保存できる新機能も追加されました。これは、オフライン時にタブを破棄する場合に便利です。タブが再び有効になると、ネットワーク経由で以前に読み込まれたキャッシュに保存されたバージョンを再読み込みするオプションが表示されます。キャッシュからのページの再読み込みを有効にするには、chrome://flags/#show-saved-copy で別のテストを試すことができます。

タブの破棄は、chrome://flags/#enable-tab-discarding で有効にして Chrome を再起動することで、今すぐお試しいただけます。有効または無効にするかどうかは、同じ Chrome chrome://flags ページで管理できます。

タブ破棄スクリーンショットを有効にする。
再起動ボタンのスクリーンショット。

chrome://discards という新しいページでは、現在開いているタブを一覧表示できます。また、タブの興味深さ(Google の推定)を最も興味深い順に表示します。

破棄されたタブページのスクリーンショット。

この機能をテストするには、システムが低メモリモードになるまで通常のブラウジング動作を行うか、[タブを今すぐ破棄] をクリックして about:discards からタブの破棄をトリガーします。リスト内の最後のタブが破棄されます。リストから特定のタブを破棄するには、対応する [破棄] ボタンをクリックします。破棄されたタブには [破棄済み] という接頭辞が付きます。

破棄されたタブのスクリーンショットの例。

タブ破棄では、タブは次の順序で破棄されます。

  • 新しいタブページ、ブックマークなどの内部ページ
  • かなり前に選択したタブ
  • 最近選択したタブ
  • ウィンドウで実行中のアプリ
  • 固定タブ
  • 選択したタブ

Windows 版と Mac OS 版の Chrome Canary でタブ破棄の試験運用版が有効になりました。Linux への実装は近日中に予定されています。

タブを破棄するかどうかを判断する際には、固定されたタブも考慮されます。

インスピレーション: ヘイ、素晴らしいサスペンダー

タブの破棄が聞き慣れている場合は、The Great Suspender など、このアイデアの少しシンプルなバージョンを提供する便利な Chrome 拡張機能に出会ったことがあるはずです。Great Suspender は、カスタマイズした一定の期間操作が行われなかったタブを停止することで、Chrome のメモリと GPU のフットプリントを削減することを目的としています。

サスペンションのスクリーンショット。

タブの破棄と同様に、タブを再度操作する必要がある場合は、タブの停止を解除できます。Great Suspender は、各タブのタイトルとファビコンを保持し、一時停止したタブを薄い色で表示します。これにより、いつでも簡単にタブに戻ることができます。

一時停止したタブのファビコンのスクリーンショット。

アクティブに使用していないバックグラウンドのタブが停止され、メモリが節約されます。ただし、現在もアクティブに使用しているタブ(GitHub と YouTube)は、引き続き正常に動作しています。

タブの破棄を開発する際に、Great Suspender 拡張機能の作成者と素晴らしい会話をしました。この問題に、拡張機能よりも効率的な方法でネイティブに取り組んでいることを、作成者は喜んでくれました。たとえば、ユーザーの無操作状態を失うなどです。

今後の改善: タブのシリアライザ

タブのシリアルライザは、タブの破棄に関する現在のアプローチを大幅に改善できる可能性がある今後の作業です。Chrome タブのコンテンツを取得し、その *現在の* 状態をバイナリ blob にシリアル化します。このバイナリ blob は、後でタブに逆シリアル化できます。

このシリアライザは、タブを適切に保持するために Chrome、Blink、V8 が必要とするほとんどのものをシリアル化します(これまで、この問題に取り組む Chrome 拡張機能では簡単に実現できなかったことです)。シリアル化には、DOM(多くの WebGL と Canvas を含む)、CSS、V8 JavaScript VM の状態など、通常の対象が含まれます。

Serializer コンセプトのスクリーンショット

Android または ChromeOS をご利用の場合、(この投稿で説明するタブ破棄テストと同様に)メモリ使用量を抑えるために、バックグラウンド タブが積極的に強制終了されることをご存じかもしれません。この問題に対処する方法の問題は、タブの状態がすべて失われることです。

タブに再度興味を示された場合は、タブを再読み込みする必要があり、タブに対する操作はすべて失われます。タブのシリアライザは、ネットワークに戻ることなく、ほぼ元の状態に戻す方法でこの問題に対処します。この取り組みについて、今後さらに詳しい情報をお知らせいたします。

タブの破棄をお試しいただき、ご感想をお聞かせください

この機能が役に立ったかどうか、また改善点があればお知らせください。ぜひお試しください(特にタブをたくさん開いている方にはおすすめです)。ご感想はコメント欄でお寄せください。crbug.com でバグが発生した場合は、チケットを送信していただけますと幸いです。