2

オブジェクトが.NETで使用しているメモリの量を確認する最も簡単な方法は何ですか?

できれば、サードパーティのツールに頼る必要はありません。Marshal.SizeOfまたはsizeof演算子は便利に見えますが、制限された範囲の型でのみ機能します。

いくつかの関連する投稿:

4

3 に答える 3

2

ここでの質問と回答:クラスが使用するメモリの量を決定しますか?

簡単にまとめると、ツールを使用したくない場合は、.NETプロファイリングAPIを使用する必要があります。

プロファイリングAPIは驚くほど強力ですが、想像力を働かせても「簡単」とは言えないと思います。そのため、メモリプロファイリングツールを使用することを強くお勧めします。無料のものもあれば、そうでないものもあります。 -非常に高価な商用のもの(特にJetBrains dotTrace)は本当に良いです。

于 2008-09-30T20:50:11.610 に答える
0

次のようなこともできます。

int startMem = GC.GetTotalMemory(true);
YourClass c = new YourClass();
int endMem = GC.GetTotalMemory(true);
int usedMeme = endMem - startMem;
于 2008-09-30T20:52:56.050 に答える
0

.NET のガベージ コレクションの性質により、実際に使用されているメモリの量を測定することはやや困難です。たとえば、クラス インスタンスのサイズを測定する場合、インスタンスが指すインスタンスによって使用されるメモリは含まれますか?

答えが no の場合は、すべてのフィールドのサイズを合計します。リフレクションを使用して、クラスのすべてのメンバーを反復処理します。typeof(ValueType).IsAssignableFrom(member.Type) に Marshal.Sizeof(member.Type) を使用します。これはプリミティブ型と構造体を測定します。これらはすべて、クラスのインスタンス割り当てに存在します。すべての参照型 (valuetype に割り当てられないもの) は IntPtr.Size を取ります。これには嫌な数の例外がありますが、それはあなたのために働くかもしれません.

答えが「はい」の場合、重大な問題があります。複数のものが単一のインスタンスを参照できるため、「a」と「b」の両方が「c」を指している場合、RecursiveSizeOf(a) + RecursiveSizeOf(b)は よりも大きくなりSimpleSizeOf(a) + SimpleSizeOf(b) + SimpleSizeOf(c)ます。

さらに悪いことに、再帰的に測定すると、循環参照が発生したり、測定するつもりのないオブジェクトが表示されたりする可能性があります。たとえば、クラスがミューテックスを参照している場合、そのミューテックスはそれを所有するスレッドを指している可能性があります。そのスレッドは、いくつかの C# フレームワーク構造を指すすべてのローカル変数を指している可能性があります... プログラム全体を測定することになる可能性があります。

C# のようなガベージ コレクトされた言語は、オブジェクトとメモリの単位を区別する方法において、(完全に非技術的な意味で) 多少「あいまい」であることを理解しておくと役立つ場合があります。Marshalマーシャリング ルールにより、マーシャリング (または測定) する構造体のメモリ レイアウトが明確に定義されているため、サイズが明確に定義されていることが保証されます。その場合、Marhsal.SizeOf() を使用する場合は、明確に定義されたマーシャリング可能な構造体を使用する必要があります。

別のオプションはシリアル化です。これは、具体的にどのくらいのメモリが使用されているかを示すものではありませんが、オブジェクトのサイズの相対的なアイデアを提供します。しかし、繰り返しになりますが、物事をシリアライズするには、適切に定義されたレイアウト (したがって、適切に定義されたサイズ) が必要です。これは、クラスを適切にシリアライズ可能にすることによって実現します。

上記のオプションのいずれかがあなたにアピールする場合は、実装例を投稿できます。

于 2013-01-31T15:18:07.700 に答える