Firefox web browser - Faster, more secure & customizable

Firefoxでは長らく種類を特定することができない謎のヒープメモリが存在していた。Nightly版でURL欄に「about:memory」を入力すると、メモリ表示の2行目に「heap-unclassified」という項目が見つかるはずだ。何に使われているのかわからない上に、全体のメモリ利用のうえでかなりの割合を占めている。この用途不明のメモリを突き止め排除すれば、メモリ使用量を大幅に減らすことが可能になるとみられる。

この用途不明メモリの正体のひとつが実はjemallocのメモリアロケート時に発生する未使用領域であることがNicholas Nethercote氏によって報告された。すでに原因も明らかになっており、調査および分析を実施した結果、どの部分を改善すればメモリ使用量を大幅に削減できるかの目処も付いているようだ。Firefox 8やFirefox 9以降のFirefoxは、メモリ使用量が大幅に減る可能性がある。

分類不能のメモリ - Nicholas Nethercote氏はこのメモリをダークマターと揶揄している。

FirefoxはFirefox 3でメモリアロケータとして新しく「jemalloc」を採用した。jemallocはもともとFreeBSDでマルチコアでスケールするアロケータが必要だとして取り込まれたもので、以後Firefoxのみならずほかのプロジェクトでも活用されている。Firefoxにおけるメモリ使用量の増加や使用量の肥大化は常に指摘され続けている問題点であり、随時改善が実施されている。

jemallocでは確保したメモリを開放するときにフラグメンテーションが発生しにくくなるように、特定のサイズに区切ってメモリの確保を実施している。たとえば1,025バイトのアロケーション要求がきた場合、jemallocは2,048バイトを確保する。1,023バイトは利用されない無駄なメモリ領域となる。Nicholas Nethercote氏はこの領域を「スロップ」と呼んでいる。

スロップを完全に排除するには、jemallocの確保するサイズでメモリ確保要求を出すようにプログラムを書き換えれば良いことになる。基本的には2のべき乗で容量を確保すればいい。既存のコードも2のべき乗でメモリを確保するなど工夫されているものもあるが、ヘッダデータを追加するために2のべき乗のサイズにさらに追加で若干のサイズが加わっているものなどがあり、かなりもったいないスロップが発生している部分があるという。

すでにどの部分でスロップが発生しているのか大枠で特定されており、改善へ向けた取り組みが進められている。スロップの発生を完全に排除するのは難しい面があるが、とくによく使われる部分のメモリ確保の方法を変更することで大きな改善が期待できる。現在すでにメモリ使用量とガベージコレクション実行の面で大きな進歩を見せたFirefoxナイトリーだが、今後さらなるメモリ使用量の削減が期待できそうだ。