Firefox web browser - Faster, more secure & customizable

MozillaはFirefox 4のリリース後に、Firefoxのメモリ使用量を削減する取り組み「MemShrink」を開始した。Firefoxは3系でかなり改善が進み、メモリ使用量からみても相応の成果をあげている。しかし、多くの新機能の追加と性能改善が行われたFirefox 4で再びメモリ使用量が増大。「メモリを食い過ぎる」とユーザから非難されるようになった。

Mozillaはこうした指摘を踏まえ、Firefoxの使用するメモリ量を削減して安定性の向上や速度の改善などを目指す「MemShrink」プロジェクトを発足。すでに本格的な活動が開始されてから半年ほどが経過している。

今回「Notes on Reducing Firefox’s Memory Consumption」に、これまでの「MemShrink」の取り組みや今後の課題などをまとめた資料が掲載された。「MemShrink」の成果は毎週発表されているが、これまでこのようなまとまった資料は公開されていなかった。資料では、この半年ほどでどういったドラスティックな変更が実施されたのかがわかりやすくまとめられており参考になるだろう。

公開された資料では、Firefox 4におけるメモリ使用量増大の主な原因として、次の3つを主に取り上げて紹介している。

  • JavaScriptエンジン「JaegerMonkey」が消費するメモリ量が多い。ガベージコレクションの動作判定が緩く、ガベージコレクションが実行されないシーンが多い。また、表現系を32ビットから64ビット(fatvals)へ変更したことで、処理速度は向上したもののメモリ使用量が増えてしまった。
  • 画像の展開処理をすべて行っていることに問題があった。バックグラウンドでローディングしているページにおいても先に画像を展開していた。(これは現在フォーカスしているページのみ画像を展開するように後ほど変更。フォーカスがなくなったページからは規定時間経過後、展開した画像データを削除するように処理を変更している)
  • 新しいHTML5パーサにバグがあり、innerHTMLセット時にメモリリークしていた。

「MemShrink」では、まず利用されているメモリの状況を正確に把握することが重要であるとし、「about:memory」で表示されるメモリ使用状況の報告内容の改善を実施。改善は逐次実施されており、最新版ほどより詳細な報告をするようになっている。以後さまざまな改善が実施されるが、特にインターナルフラグメンテーション発見とその削減の取り組みが大きな成果を上げたとしている。この取り組みは当時、「ダークマターの発見」として大きく注目された。

Firefoxはメモリ確保にjemallocを採用している。jemallocは動作のシンプル化と高速化のために、要求されたメモリサイズに対して、実際には区切りのよい大きめのサイズを確保する仕組みになっている。この仕組みでは使われないメモリ領域が生まれることになるが、その分動作は高速になるし、ソースコードの見通しも良くなる。

「MemShrink」では実はこの無駄な使われないメモリ領域、インターナルフラグメンテーションが考えていた以上に多くあったとして改善に取り組み、なるべく無駄が出ないようにメモリを確保する処理への書き換えを実施。結果的にメモリ使用量の削減に成功したとしている。「MemShrink」の取り組みが開始されたのはFirefox 7が開発版の段階にあったときであるため、Firefox 7から大きくメモリ使用量の削減が実現されている。報告によればおおよそ次のような削減が実現されているという。

  • Firefox 7 - 6と比べて20%から30%の削減 (場合によっては50%ほどの削減)
  • Firefox 8 - 7と比べて14%の削減
  • Firefox 9 - 7と比べて30%の削減
  • Firefox 10 - 数値はまだないが削減していると報告されている
  • Firefox 12 - 数値はまだないが削減していると報告されている

「MemShrink」では、メモリ使用量の削減に向けすでにいくつかの作業項目をあげており、今後もメモリ使用量の削減が進むと見られる。今後の主な作業内容としては、次の項目が紹介されている。

  • JavaScriptガベージコレクタを改善し、現在存在している多くのフラグメンテーションをより少なくするようにする。
  • より優れた画像展開処理の実現。
  • PCやOSのメモリ状況に応じて動作を変えるアダプティブ処理の実現。

FirefoxはFirefox 7以降、リリースごとにメモリ使用量の削減を実現しており、今後もさらに改善すると見られる。

Firefoxのメモリ使用量の多さが原因でほかのブラウザを利用しているユーザは、このようにメモリ使用量を削減している最新のFirefoxについて、利用に値するかどうかを再度検討してみるのもよいだろう。