4

複数のコンポーネントで構成され、それぞれが単一のDLLにコンパイルされ、それぞれがそれ自体の中で複数のスレッドを実行するアプリケーションがあります。これらのコンポーネントを起動するシェルプログラムがあります。

私はこのアプリケーションをWindowsCE6環境で実行していますが、これは(システムのプログラムを除いて)唯一のプログラムです。ただし、タスクマネージャウィンドウを見ると、時間の経過とともに、割り当てられたメモリ使用量が徐々に増加していることがわかります。私のプログラムにメモリリークがあるのではないかと疑っています。次のようにします。

特定のコンポーネントに移動して、次のコードを呼び出す30分ごとに実行されるTimerオブジェクトを作成します。

long memByte = GC.GetTotalMemory(false);
Console.Write("Heap Memory: " + (memByte/1000).ToString() + "KB");

インターネットを読んでみると、GetTotalMemoryは基本的にシステムのトータルマネージメモリを提供してくれると思います。プログラムにメモリリークの問題がない場合は、結果をグラフ化すると、時間外に何らかのフラットラインが発生する可能性があります。そうでなければ、ゆっくりと増加します。

私の質問は、GetTotalMemoryは実際にすべてのアプリケーションの合計管理ヒープメモリを提供しますか、それともこのコードが実行されている現在のコンポーネントによって使用されている特定のヒープのみを提供しますか?

ありがとうございました、

4

2 に答える 2

2

タスクマネージャーは、GC.GetTotalMEmoryとは異なる情報を表示しています。GC.GetTotalMemoryがフラットなアプリを作成することは可能ですが、デバイスのメモリが不足してクラッシュします。

GC.GetTotalMemoryは、割り当てられた仮想メモリまたは物理メモリではなく、GCヒープのみを調べます。GCHeapの外部でのP/Invokesとネイティブ割り当ては、GC.GetTotalMemory呼び出しに対して透過的になります。そのため、実際にリークしているかどうかを判断しようとするのは、かなり役に立たない呼び出しです。

GCヒープは、OSメモリマネージャーをまったく呼び出さずに拡大または縮小することがあります。実際、そうすることはかなり一般的です。GCはOSから一度に大きなチャンクを取得し、アプリがGCヒープメモリを必要とするため、それを小さなブロックに分割します。

デバイスのコントロールパネルにovrが表示されている実際のOS割り当てを追跡する場合は、 GlobalMemoryStatusを呼び出します。

于 2012-08-28T19:38:30.173 に答える
1

このメソッドは、プロセスの管理されたメモリ使用量を返します。システム全体ではありません。

プロセスには、他のプロセスのメモリを照会する権限さえない場合があります。

于 2012-08-28T18:34:48.967 に答える