Google Chromeの最大の欠陥が修正へ

S 20201226 100508

Windows版のChromeでは、RAMを大量に使用してシステムが不安定になるという大きな問題が報告されています。

Googleはセグメントヒープに変わる新たなメモリ管理手法「ParitionAlloc-Everywhere」を導入し、RAM使用量を削減する計画を立てているようですが、同時に進められている「TerminateProcess」の導入もChromeが使用するメモリ使用量の削減に効果があるとの指摘が行われています(MSPoweruser)。

4GBまたは8GB程度のRAMしか搭載していないWindows 10デバイスでは、Chromeが応答しなくなったり、デスクトップがクラッシュしたりといった現象が発生しがちでした。また複数のタブを開いたまま長時間の作業を行ったあとブラウザを閉じてもシステムリソースを消費するプロセスが残ったままになっていた場合もありました。

これらの現象の原因として、ブラウザの終了処理が完全に成功しておらず、バックグラウンドでリソースが確保されたままになっていることが理由の1つとして考えられます。このもないを解決するためにTerminateProcessの導入をGoogleが進めているのです。

TerminateProcessは、Windowsで指定したプロセスとそのすべてのスレッドを無条件に終了させるために用いられる関数です。TerminateProcessを実行することで、複雑な終了処理を行わなくてもChrome終了時にリソースが適切に開放され、システム全体のリソース消費量が少なくなることが期待されます。

Googleは以下のように説明しています。

Exiting a process cleanly is difficult and expensive. Avoiding race conditions becomes almost impossible with complex software and a clean exit can be quite slow. Waiting on all threads, paging in code and data, and race conditions make it not worthwhile.

プロセスをクリーンに終了することは難しくコストもかかります。競合状態を回避することは複雑なソフトウェアではほとんど不可能で、クリーンな終了は非常に遅くなります。すべてのスレッドで待機したり、コードやデータのページングを行ったり、競合状態になったりすると、あまり意味がありません。

We have been gradually moving towards using TerminateProcess for more process types. Although the majority of the shutdown processes tracked by this bug are in utility processes this change uses TerminateProcess for all process types. We should not need to let destructors run so it should be safe to never use exit() (or to make it opt-in).

より多くのプロセスタイプにTerminateProcessを使用する方向に徐々に移行してきました。このバグによって追跡されるシャットダウンプロセスの大部分はユーティリティプロセスにありますが、この変更ではすべてのプロセスタイプにTerminateProcessを使用しています。デストラクタを実行させる必要はありませんので、決して exit() を使用しないことが安全なはずです (または、オプトインにすること)。

この変更が有効になる次期は不明ですが、複数のタブやブラウザ全体を閉じても RAM使用量が変わらないという問題を防ぐことができると見込まれます。