Firefox, Workingset and Vista

このネタも飽きてきましたが.GIGAZINEより.

IE7の最終ベータ版になる予定の「Internet Explorer 7 Beta 3」は最小化すると、利用しているメモリをシステムに戻し、そのときに必要な最低限のメモリだけを利用するという仕様になったようです。メモリをどんどん消費するFirefoxへの対抗策らしいですが…。

詳細は以下の通り。

Internet Explorer 7 Beta 3 may have memory handling advantages over Firefox | TG Daily

IE7 Beta 3とFirefox 1.5.4で同じページを表示した結果、いずれも最初は同じように64MBのメモリを消費。しかし最小化するとIE7 Beta 3は10MBしかメモリを利用せず、Firefox 1.5.4は相変わらず57MBのメモリを消費した、とのことです。

要するにIE7 Beta 3はメモリ上に展開されていた分を仮想メモリなりに書き戻していると推測されますが、これと同じ事はFirefoxThunderbirdでも設定を変えれば簡単にできるわけで。

GIGAZINE - FirefoxやThunderbirdのメモリ消費量を劇的に減らす方法

体感速度がやや落ちてレスポンスが多少下がったとしても、常にメモリをバカスカ消費されるよりはマシだ、というトレードオフの考えを受け入れることができるのであればこういう考え方もありなのではないかと。

どうやらマイクロソフトIE7開発陣はデフォルト設定でメモリをいつも消費しない方向の路線で行くようですが、Firefoxの選択やいかに。

これは Windows OS の微妙な挙動によるもので,

について先日書きました(id:NyaRuRu:20060620#p2).

おまけ.

そんなに減らしたいなら外から SetProcessWorkingSetSize 呼んでやりましょうと.以下 C# で作ってみた使い捨てアプリにて SetProcessWorkingSetSize を呼んでみるの図.

初期状態 ワーキングセット 70 MB
Start Trimming 押下直後 400 KB*2

ソースはこちら.

http://www.dwahan.net/nyaruru/hatena/MyTrimmer.zip

ソースを読む限り,Mozilla 製品は KB293215 の挙動を前提としているようですね.
nsWindow.cpp Rev. 3.651 1825 行目


1825 NS_IMETHODIMP nsWindow::SetSizeMode(PRInt32 aMode) {
1826
1827 nsresult rv;
1828
1829 // save the requested state
1830 rv = nsBaseWidget::SetSizeMode(aMode);
1831 if (NS_SUCCEEDED(rv) && mIsVisible) {
1832 int mode;
1833
1834 switch (aMode) {
1835 case nsSizeMode_Maximized :
1836 mode = SW_MAXIMIZE;
1837 break;
1838 case nsSizeMode_Minimized :
1839 #ifndef WINCE
1840 mode = gTrimOnMinimize ? SW_MINIMIZE : SW_SHOWMINIMIZED;
1841 #endif
1842 break;
1843 default :
1844 mode = SW_RESTORE;
1845 }
1846 ::ShowWindow(mWnd, mode);
1847 }
1848 return rv;
1849 }

(というかこのコード,WINCE マクロが定義されているとき未初期化変数 mode に触ってない?)
mozillaZine によると,config.trim_on_minimize の効果は次のようなものだそうです.

Possible values and their effects

true
Allow Windows to reclaim memory when the program is minimized.
false
Prevent Windows from reclaiming memory when the program is minimized. (Default)

従って,config.trim_on_minimize="true" は,「最小化時にワーキングセットをトリミングするよ」という設定ではなくて,「最小化時に OS がワーキングセットをトリミングすることを許可するよ」という設定のようですね.ということは,config.trim_on_minimize="true" にもかかわらず「最小化時にワーキングセットをトリミングされない」という現象が起きたとしても,それは by design と*3

*1:繰り返しになりますが,常に同じ挙動をするとは限らないことに注意をしてください.メモリアクセスパターンの解析やヒューリスティックなアプローチが進化した可能性があります.また Internet Explorer 6 に関する KB900856 のように,OS のメモリ管理とは関係のない最小化時のロジックが,Intenet Explorer には実装されているかもしれません.

*2:実際には Update するともう少し増えている

*3:Windos Vista とか Windows 9x 系とか?