web-dev-qa-db-ja.com

メモリ内のオブジェクトサイズを取得する方法?

オブジェクトがメモリ内で消費するバイト数(C#)を知る必要があります。たとえば、HashtableSortedList、またはList<String>の量。

185

これは正確ではないかもしれませんが、私にとっては十分に近いです

long size = 0;
object o = new object();
using (Stream s = new MemoryStream()) {
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(s, o);
    size = s.Length;
}
158
Rush Frisby

直接入手できるとは思いませんが、間接的に見つける方法はいくつかあります。

1つの方法は、 GC.GetTotalMemory メソッドを使用して、オブジェクトの作成前後に使用されるメモリ量を測定することです。これは完璧ではありませんが、アプリケーションの残りを制御する限り、興味のある情報を取得できます。

それとは別に、プロファイラーを使用して情報を取得するか、 profiling api を使用してコードで情報を取得できます。しかし、それは使いやすいとは思いません。

同様の質問については、 C#のオブジェクトで使用されているメモリ量を確認しますか? を参照してください。

102
Rune Grimstad

OK、この質問は回答済みで、回答は受け入れられましたが、誰かが答えてくれと頼みました。

まず第一に、確かに言うことはできません。これは内部実装の詳細であり、文書化されていません。ただし、他のオブジェクトに含まれるオブジェクトに基づきます。ここで、キャッシュされたオブジェクトのメモリ要件をどのように計算しますか?

私は以前このテーマに触れていました 記事

ここで、キャッシュされたオブジェクトのメモリ要件をどのように計算しますか?ほとんどの人が知っているように、Int32とfloatは4バイト、doubleとDateTimeは8バイト、charは実際には2バイト(1バイトではない)などです。文字列はもう少し複雑で、2 *(n + 1)です。nは文字列の長さです。オブジェクトの場合、そのメンバーに依存します。すべてのオブジェクト参照が32ビットボックス上の4バイトポインターにすぎないことを思い出して、そのすべてのメンバーのメモリ要件を合計するだけです。さて、これは実際にはまったく真実ではありません。ヒープ内の各オブジェクトのオーバーヘッドを処理していません。これについて心配する必要があるかどうかはわかりませんが、小さなオブジェクトをたくさん使用する場合は、オーバーヘッドを考慮する必要があると思います。各ヒープオブジェクトのコストはプリミティブタイプと同じで、オブジェクト参照に4バイト(32ビットマシンでは、BizTalkは64ビットマシンでも32ビットを実行しますが)、さらにタイプオブジェクトポインターには4バイト、さらに4同期ブロックインデックスのバイト。この追加のオーバーヘッドが重要なのはなぜですか?さて、2つのInt32メンバーを持つクラスがあるとしましょう。この場合、メモリ要件は8ではなく16バイトです。

26
Aliostad

管理されていないオブジェクト:

  • Marshal.SizeOf(object yourObj);

値タイプ:

  • sizeof(object val)

管理対象オブジェクト:

25
NileshChauhan

次のコードは、シリアル化できる限り、渡されたオブジェクトのサイズをバイト単位で返す必要があります。ゲームプラットフォームでSRAMに書き込む問題を解決するために、Quixantの同僚からこれを入手しました。役に立てば幸いです。クレジットとCarlo Vittuciに感謝します。

/// <summary>
/// Calculates the lenght in bytes of an object 
/// and returns the size 
/// </summary>
/// <param name="TestObject"></param>
/// <returns></returns>
private int GetObjectSize(object TestObject)
{
    BinaryFormatter bf = new BinaryFormatter();
    MemoryStream ms = new MemoryStream();
    byte[] Array;
    bf.Serialize(ms, TestObject);
    Array = ms.ToArray();
    return Array.Length;
}
16
Kevin Hirst

デバッグモードで

sOSを読み込む

そして、dumpheapコマンドを実行します。

0
A.m.a.L