読者です 読者をやめる 読者になる 読者になる

Q293215 : The working set of an application is trimmed when its top-level window is minimized

.NET

.NET についてよく耳にする「なんかやたら大量にメモリを使っているんですが」と「最小化すると減るよ」について.

LadyBug さんが行われているように,管理ツールの『パフォーマンス』を使って Process オブジェクトの Working Set カウンタ*1に注目してみると,確かに WinForms アプリケーションを最小化時すると大きく値が減少することが分かります.
.NET ということで GC との関係も気になるところですが,もしかしたらこの現象,Win32 アプリケーションに共通なものなのかもしれません*2

SYMPTOMS

When an application's top-level window is minimized through the Minimize command from its System menu or a click on its Minimize button, the operating system will trim the working set for the process. This is done to free up RAM for foreground applications. As a result of this trimming, a process may experience significantly poorer performance because its memory pages are being faulted back into RAM.

実際,KB に載っている回避コードを WinForms アプリケーションに移植してみたところ,最小化による Working Set の減少は起きなくなりました.
んで,そういや「ウィンドウ最小化で」って最近どこかで見たよなーということで思い出したのがこれです.

解決方法は、IE6のウィンドウを最小化すること。ウィンドウの最小化でキャッシュされたメモリが開放されるという。また、Webサイト管理者向けには、HTMLファイル内にBODY要素「ondragstart」イベント属性を記述し、ドラッグを無効にすることを掲載している。

http://support.microsoft.com/kb/900856/ja
Q293215 とは直接は関係ないのかもしれませんが,「最小化」がトリガーとなるという共通点はなかなかに興味深いですね.

*1:「該当プロセスのワーキング セットの現在のサイズをバイト数で表示します。ワーキング セットは、プロセスのスレッドが最後に参照したメモリ ページのセットです。コンピュータの空きメモリ領域がしきい値以上ある場合、ページは使用中でなくてもプロセスのワーキング セットに残されます。空きメモリ領域がしきい値を下回る場合、ページはワーキング セットから削除されます。削除されたページが必要な場合、ページがメイン メモリから出る前にページはワーキング セットに戻されます。」(『パフォーマンス』の説明より)

*2:探してみると Eclipse にバグ登録されている等,割と色々見つかります