DOBON.NET DOBON.NETプログラミング掲示板過去ログ

.NETアプリのタスクマネージャでのメモリ使用量について

環境/言語:[Framework2.0,WindowsXP]
分類:[.NET]

よろしくお願いします。

.NETで開発したアプリは、たとえ単純にフォームだけを配置したものであっても、
起動直後にタスクマネージャでそのアプリのメモリ使用量を確認すると20MBも消費
しているように見えます。しかし、アプリを一度最小化するとメモリ使用量は5MB
程度に落ち着きます。なんでだーと思っていたのですが、下記の記事に答えがありました。

Windows業務アプリケーション開発 Q&A #1
http://www.atmarkit.co.jp/fdotnet/vblab/appqa_01/appqa_01_01.html

記事によれば、.NETアプリのタスクマネージャにおけるメモリ使用量は正確ではなく、
実際のメモリ使用量を得るにはSystem.GC.GetTotalMemoryを使えとあります。
C#でMessageBox.Show(System.GC.GetTotalMemory(false).ToString());
とすると実メモリ使用量は5MB前後のようです。
タスクマネージャから確認できるメモリ使用量はワーキングセットという事前に確保されたメモリ領域だそうです。

質問なのですが、このワーキングセットは実メモリ使用量とは違うとしても、
そのメモリ領域は確保されているのだから他のアプリからは使用できないはずです。
となると、.NETアプリが実際に使用しているのが5MBだろうと、ワーキングセット
として20MB確保していれば、その.NETアプリは20MBを消費しているとほぼ同義だと
思うのです。.NETアプリを起動して最小化せずにしばらく放置しておいてもタスクマ
ネージャの値は20MBから減りません。ここでアプリを最小化すれば5MBまで減りま
す。ということは全ての.NETアプリは起動直後に自動的に一度最小化して元に戻すよ
うなコードを入れた方が、メモリ効率という点からは有効なのでしょうか?
> 質問なのですが、このワーキングセットは実メモリ使用量とは違うとしても、
> そのメモリ領域は確保されているのだから他のアプリからは使用できないはずです。

だとしても問題ありません。

単に「領域が予約されている」だけで、実際に何か物理的な資源が大量に使用されているわけではないからです。

まったく何も資源が使われてないわけではありませんが、説明すると長くなるので、詳しく知りたければ仮想記憶の仕組みについてお勉強してください。
■No16326に返信(ぶちゃらてぃさんの記事)

> ということは全ての.NETアプリは起動直後に自動的に一度最小化して元に戻すよ
> うなコードを入れた方が、メモリ効率という点からは有効なのでしょうか?

まさにその質問に対する答えが、↓にあります。答えは、「いいえ」だそうです。

The Memory Mystery
http://getdotnetco.web101.discountasp.net/GdncStore/free/Articles/The%20Memory%20Mystery.htm

DOBON.NET | プログラミング道 | プログラミング掲示板