f99aq8ove's blog

Firefox 等の trim_on_minimize どーのこーののまとめ

tag: firefox
17 April 2006

このエントリは 2006-04-17 に書かれました。 内容が古くなっていたり、もはや正しくないこともありますので、十分検証を行ってください。

はてなブックマーク - trim_on_minimizeでは、「FirefoxやThunderbirdのメモリ消費量を劇的に減ら」せない - ◆F99a.q8oVE::Blog これを書いている時点で50件もブックマークがついています。すごい!

しかし、反論先のエントリー (はてなブックマーク - GIGAZINE - FirefoxやThunderbirdのメモリ消費量を劇的に減らす方法) はというと、555件のブックマークがついています。

私のエントリーが信用できないという人も居るでしょうから、ここで、真偽のほどを確かめてみましょう。

まずは、Firefoxのソースを入手しました。Index of /pub/mozilla.org/firefox/releases/1.5.0.2/source

そして、問題の "trim_on_minimize" で grep すると、/mozilla/widget/src/windows/nsWindow.cpp の1642行目あたりで trim_on_minimize が true であると、gTrimOnMinimize に 1 を代入していることがわかります。ここで、gTrimOnMinimize で grep し直してみました。すると、trim_on_minimize と同じように nsWindow.cpp 内でしか使用されていないことがわかります。ここで注目すべきは次の2箇所。

1920://-------------------------------------------------------------------------
1921://
1922:// Maximize, minimize or restore the window.
1923://
1924://-------------------------------------------------------------------------
1925:NS_IMETHODIMP nsWindow::SetSizeMode(PRInt32 aMode) {
1926:
1927:  nsresult rv;
1928:
1929:  // save the requested state
1930:  rv = nsBaseWidget::SetSizeMode(aMode);
1931:  if (NS_SUCCEEDED(rv) && mIsVisible) {
1932:    int mode;
1933:
1934:    switch (aMode) {
1935:      case nsSizeMode_Maximized :
1936:        mode = SW_MAXIMIZE;
1937:        break;
1938:#ifndef WINCE
1939:      case nsSizeMode_Minimized :
1940:        mode = gTrimOnMinimize ? SW_MINIMIZE : SW_SHOWMINIMIZED;
1941:        break;
1942:#endif
1943:      default :
1944:        mode = SW_RESTORE;
1945:    }
1946:    ::ShowWindow(mWnd, mode);
1947:  }
1948:  return rv;
1949:}
5062:#ifndef WINCE
5063:    case WM_SYSCOMMAND:
5064:      // prevent Windows from trimming the working set. bug 76831
5065:      if (!gTrimOnMinimize && wParam == SC_MINIMIZE) {
5066:        ::ShowWindow(mWnd, SW_SHOWMINIMIZED);
5067:        result = PR_TRUE;
5068:      }
5069:      break;
5070:#endif

これらは、gTrimOnMinimize が false の時は最小化時に SW_SHOWMINIMIZED というウィンドウメッセージを送信するが、true の時は SC_MINIMIZE を送信することを表しています。

ここで、次を参照してください。これら二つのウィンドウメッセージの違いについて書かれています。The working set of an application is trimmed when its top-level window is minimized

簡単 (?) に言えば、ShowWindow() に SW_MINIMIZE を指定して実行すると、プロセスのワーキングセットサイズが減らされるよ。ワーキングセットサイズが減らされたら、減らされた分の物理メモリ領域にフラグが立って他のプロセスから使えるようになるよ! 減らされた部分はOSがHDに書き出しておくね! みたいな…。

# タスクマネージャーにメモリ使用量と仮想メモリサイズを表示させて確認してみたらいいですかね。

なんかよさそうに見えますね。でも待ってください。次に Firefox を使おうと思ってアクティブにした瞬間、ガリガリと音を立てて HD から物理メモリに読み出すことになります。パッと表示されないぶん不快に感じるでしょうね。別にメモリ使用量が減るわけではありません。HD に書き出しただけです。メモリが十分にあるなら HD に書き出す意味なんてありません。むしろ、メモリが少なかったとしても、OS がうまいことやってくれますから小細工をやるのはよした方が良いと思いますがね。

ごちゃごちゃでわかりにくいけど、以下を引用してこのエントリーは終わり。

1625:    /* The internal variable set by the config.trim_on_minimize pref
1626:       has not yet been initialized, and this is the hidden window
1627:       (conveniently created before any visible windows, and after
1628:       the profile has been initialized).
1629:
1630:       Default config.trim_on_minimize to false, to fix bug 76831
1631:       for good.  If anyone complains about this new default, saying
1632:       that a Mozilla app hogs too much memory while minimized, they
1633:       will have that entire bug tattooed on their backside. */

Related Posts