-1

C#アプリのメモリフットプリントを制限(約1〜2 GB)未満に減らすために、すべての変数のリストをリアルタイム(実行時)で、それらが消費するメモリの量(さらにはコンテンツ)。

私が見ることができることから、この一見単純な要求は、そこにあるメモリプロファイラーの注意を逃れたようです。たとえば、.NET Memory Profilerは、指定された各タイプ(Int32 []やStringなど)のメモリを表示しますが、名前付き変数ごとのメモリをより細かく表示することはできないようです。

dotTraceまたはANTSMemoryProfilerを試したことはありませんが、FAQ、ビデオ、およびスクリーンショットをスキャンすると、空白が表示されます。

私自身の変数とは別に、必要なプロファイラーには、.NETアプリで一般的な「オーバーヘッド」メモリ使用量が含まれている可能性がありますが、私にとってはそれほど重要ではありません。

これを実行できるプログラム(できれば無料または100ドル未満)はありますか?

- - - - - - - 編集

(Jon Skeetによって示されるように)相互に参照する変数の場合、またはメソッドへの参照によって渡される変数の場合、プロファイラーはそれらをグループ化して、それらが実際に同じオブジェクトであることを示すことができます(したがって、同じメモリを「共有」します) )、または元の変数名を表示して参照を省略します。

4

1 に答える 1

4

ただし、名前付き変数ごとにメモリをより細かく表示することはできないようです。

それはおそらくそれがあまり意味をなさないためです。変数自体は通常、多くのメモリを消費しません。メモリを消費するのはオブジェクトであり、変数はそれらのオブジェクトがガベージコレクションされるのを防ぐだけです。

したがって、たとえば、次のコードについて考えてみます。

byte[] array = new byte[1024 * 1024]; // 1MB
byte[] array2 = array;
byte[] array3 = array;

ここには3つの変数があり、すべて同じ配列を参照しています。あなたの望むツールは、それぞれが取っていることをどのくらいのメモリで示しますか?1MB、それぞれが1MBのアレイを参照しているためですか?実際に使用されているのは1MBだけですが、表示される合計メモリは3MBになるため、これは混乱を招きます。0.3333MB?確かにもっと混乱します。1MB?正確ですが、役に立ちません。

どのオブジェクトが必要以上に長く存続するかに集中してから、それらのオブジェクトを存続させているものを見つけ出す必要があります。

通常、「一見単純なリクエスト」がその地域の専門家の「注目を逃れた」ように見えるのは、結局のところ単純なリクエストではないからです。

于 2012-11-11T08:36:14.037 に答える