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

Addy Osmani 氏
Addy Osmani 氏

Chrome のメモリ使用量の削減は、チームの今年の最優先事項の一つです。V8 のガベージ コレクション プロセスの改善により、Gmail のメモリ使用量は最大で 45% 削減されましたが、これはまだ始まったばかりです。メモリ使用量に関する次のテストの 1 つは、タブをため込むことです(私と同様)。これはタブ破棄と呼ばれます。

開いているタブのすべてがタブで使用されるわけではありません。メモリが少ない場合、無関係な背景のタブは破棄されることがあります。

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

背景

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

タブごとに必要なメモリ

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

メモリが必要なタスク マネージャー

このような場合は、タブを破棄することでメモリ使用量を削減できます。

使用していないタブを破棄する

タブ破棄とは、システムメモリの空き容量が非常に少ないことが検出されたときに、あまり重要でないタブを自動的に破棄する機能です。破棄とは、どういう意味でしょうか?破棄したタブはどこにも移動しません。強制終了しても、Chrome のタブバーには表示されます。破棄されたタブに戻ると、そのタブをクリックすると再読み込みされます。フォーム コンテンツやスクロール位置などは、タブで前後に移動するときと同じ方法で保存および復元されます。

また、すべてのタブリソースをローカルにキャッシュできる別の新機能もあります。この機能は、オフライン時のタブの破棄にも対応しています。タブが再び有効になると、以前にネットワーク経由で読み込んだキャッシュ バージョンを再読み込みするかどうかを選択できます。キャッシュからのページの再読み込みを有効にするには、chrome://flags/#show-saved-copy で別のテストを試します。

タブの破棄を今すぐ試してみるには、chrome://flags/#enable-tab-discarding で有効にし、Chrome を再起動します。有効 / 無効の切り替えは、同じ Chrome の chrome://flags ページで管理できます。

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

chrome://discards という新しいページでは、現在開いているタブを一覧表示できます。Google では、各タブの興味深い内容(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 の状態などが疑わしい点があります。

シリアライザーのコンセプトのスクリーンショット

Android や ChromeOS を使用している場合は、すでにご存じかもしれません(この投稿で扱ったタブ破棄の実験と同様に、メモリ使用量を抑えるためにバックグラウンドのタブを積極的に強制終了します)。私たちが取り組む方法における問題は、タブの状態が *すべて* 失われることでした。

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

タブの破棄をお試しいただき、ぜひご意見をお聞かせください

この機能がお役に立ったかどうか、改善の余地があればお聞かせください。ぜひお試しになり、(特にタブをたくさんお持ちいただいている場合は)ぜひコメント欄でお知らせください。また、crbug.com でバグに遭遇した場合はチケットを提出していただけると助かります。