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はメモリ上に展開されていた分を仮想メモリなりに書き戻していると推測されますが、これと同じ事はFirefoxやThunderbirdでも設定を変えれば簡単にできるわけで。
GIGAZINE - FirefoxやThunderbirdのメモリ消費量を劇的に減らす方法
体感速度がやや落ちてレスポンスが多少下がったとしても、常にメモリをバカスカ消費されるよりはマシだ、というトレードオフの考えを受け入れることができるのであればこういう考え方もありなのではないかと。
どうやらマイクロソフトのIE7開発陣はデフォルト設定でメモリをいつも消費しない方向の路線で行くようですが、Firefoxの選択やいかに。
これは Windows OS の微妙な挙動によるもので,
- Windows Vista では Internet Explorer 7+ を最小化してもタスクマネージャに表示される「メモリ消費量」はほとんど変化しないこと*1
- 同様に,Windows Vista では『FirefoxやThunderbirdのメモリ消費量を劇的に減らす方法』の効果が無くなるか,限定的になるであろうこと
- わざわざ最小化に拘らなくても,C# で 10 分ぐらいでかけるツールで「メモリ消費量」の表示値を激減させる方法があること
について先日書きました(id:NyaRuRu:20060620#p2).
おまけ.
そんなに減らしたいなら外から SetProcessWorkingSetSize 呼んでやりましょうと.以下 C# で作ってみた使い捨てアプリにて SetProcessWorkingSetSize を呼んでみるの図.
ソースはこちら.
ソースを読む限り,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.