Inside Firefox – The Inside Track on Firefox Development
A lot of people complain about the Firefox “memory leak(s)”. All versions of Firefox no doubt leak memory – it is a common problem with software this complicated. We look to fix the issues where we can. David Baron and others have done a huge amount of excellent work in this area.
What I think many people are talking about however with Firefox 1.5 is not really a memory leak at all. It is in fact a feature.
(多くの人々から Firefox の “メモリリーク” についての不満をよく聞く。 こういった複雑なソフトウェアでは一般的な話だが、きっと全てのバージョンの Firefox にメモリリークは存在する。 David Baron や多くの人たちがこの分野に関して素晴らしい仕事をたくさんしてくれている。
しかしながら、多くの人が Firefox 1.5 のメモリリークだと言っていることは実際はメモリリークではなく仕様だと思う。)
昨年の9月に Firefox 1.0系はメモリを解放しない? というエントリを書いてメモリ使用量に関する情報を書いたが、 その後 Firefox のバージョン 1.5 がリリースされてもあまり変わってないといった不満があるようだ。
しかし、上に引用した Firefox のリードエンジニアで・る Ben Goodger のエントリでは、メモリリークの問題がまだあることを認めつつも、メモリの使用が増えていく現象のいくつかは快適なブラウズを実現するための機能(仕様)だと言っている。
また、Memory Usage and Thread FAQ (えむもじらさんが日本語訳を用意してくれている、このページにはメモリリーク情報がまとめられていてとても役立つ) にあるように、 OSのメモリ表示は実際のアプリケーションの使用量と一致していない場合がある。 なので、その数字を見て Firefox がメモリ喰いだと思うのは間違いとのこと。 (じゃあ解放されてるけど、Firefoxからは使ってない、OSや他のアプリケーションからも使えない中途半端なメモリ領域があるってことだろうか? それも問題な気がするが…。 メモリ管理の詳しい人がいたら教えてください。)
さて、今回紹介されていたのは、過去に移動したページに素早く戻るためにページをキャッシュするという機能。 大きなサイズのページを読みこんだあとや、画像などをたくさん埋めこんだページを読みこんだあとに、メモリの消費サイズが急に増えたように見える場合はこの現象に遭遇しているかもしれない。
Firefox がオープンソースらしいのはこういった機能が、設定によってコントロールが可能になっていること。 以下のようにすることで設定が可能になっている。
1) about:config というURLをロケーションバーに入力
2) browser.sessionhistory.max_total_viewers という設定項目をダブルクリックする (フィルタを使うと見つけやすい)
3) 表示されるダイアログにページ数を入力する
初期値では -1 という値になっていて、 256MBのRAMを積んだマシンで3ページ、 512MB で 5ページ、1GB以上で 8ページ というように、搭載メモリに応じて自動的に決めるような設定になっている。 入力した数が戻るようにキャッシュされるページ数になり、0にしたらこの機能がオフになる。
ただし、Firefox 1.5 のこの仕様は全ページのナビゲーションの実に 39% が戻る(Back)ボタンを押したりした、10 ページ以内の過去のページへの移動だという調査結果に基づいて決められたとのこと。
この設定を変更すると、メモリの使用量は少なくなるが、その分ページのロードに時間がかかったりと、人によっては使い勝手が悪くなると感じるかもしれない。 たとえば、メモリは1GB以上と多く積んでいるが8ページも戻ったりしないというような人にはいいかもしれない。
2006年2月15日 at 1:06 PM
> じゃあ解放されてるけど、Firefoxからは使ってない、OSや他のアプリケーションからも使えない中途半端なメモリ領域があるってことだろうか?
微妙なとこですが、一応あると思います。
FireFox の内部構造は知りませんが、IE なんかでも JavaScript をぶんぶん使うようなサイトでは、JScript エンジンがアロケートするメモリの heap サイズを大きくしていくので (DBと一緒かな?)、ずっとそのページを使っているとどんどん IE (JScript) の使用メモリが増え続けることになります。そしてそのさいフラグメントが増えて、実際使用しきれてないメモリが出てくるということはあります。
一応、プログラム的に CompactAllHeap などとして Heap サイズを最適化することはできますが、これまた Cost の高いオペレーションなため、いつ実行するのかという問題になるので、自動では行わなかったりします。
でも、IE を閉じればちゃんとすべてのメモリは開放されるので、これはメモリーリークではなく”仕様”ってことになってます。(私もこれには IE のPM としてかなり頭を悩まされたのですが)
2006年2月15日 at 11:28 PM
おー、(元?) 専門家からの話、ありがとうございます。
やっぱり使われないエリアとかでてくるんですね。 確かに、どのタイミングで実装したらいいのか難しいのはよくわかります。 Java のガベージコレクションは少ないメモリ量で何とかしなきゃいけないこともあって、がんばって解放するタイミングを計ってるみたいですが、それでもパフォーマンスに影響がでることは永遠に言われ続けるでしょうし。
Firefox のキャッシュの実装にもよるとは思いますが、Firefox は解放してるけど使えないエリアというのは結構ありそうですね。
で、同じことは Windows (IE や Explorer) にも言えるような…。 Windows をずっと起動してるとメモリの使用量が増えたり、動きがあやしくなるというのはこのヘンの問題も絡んでそう。
2006年2月18日 at 6:28 PM
firefoxを使用している方へ!
カテゴリが微妙に違いますがお許しを!
firefoxは次世代のブラウザとして非常に注目されています。
タブ機能や拡張機能など、IEにはない機能満載で、
僕は大好きなのですが、
重大なバグがあります。
それは、
使用していると少しずつ、メモリーの消費…