it-swarm.com.de

Wie bekomme ich die Objektgröße in den Speicher?

Ich muss wissen, wie viele Bytes mein Objekt im Speicher belegt (in C #). Zum Beispiel, wie viel mein Hashtable oder SortedList oder List<String>.

188

das mag nicht genau sein, aber es ist nah genug für mich

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

Ich glaube nicht, dass Sie es direkt bekommen können, aber es gibt ein paar Möglichkeiten, es indirekt zu finden.

Eine Möglichkeit ist die Verwendung von GC.GetTotalMemory Methode zum Messen des Speicherbedarfs vor und nach dem Erstellen Ihres Objekts. Dies wird nicht perfekt sein, aber solange Sie den Rest der Anwendung kontrollieren, erhalten Sie möglicherweise die Informationen, an denen Sie interessiert sind.

Abgesehen davon können Sie einen Profiler verwenden, um die Informationen abzurufen, oder Sie können profiling api verwenden, um die Informationen im Code abzurufen. Aber ich denke, das wird nicht einfach zu bedienen sein.

Siehe Finden Sie heraus, wie viel Speicher von einem Objekt in C # belegt wird? für eine ähnliche Frage.

107
Rune Grimstad

OK, diese Frage wurde beantwortet und die Antwort akzeptiert, aber jemand hat mich gebeten, meine Antwort zu hinterlassen, damit Sie loslegen können.

Zunächst ist es nicht möglich, sicher zu sagen. Es ist ein internes Implementierungsdetail und nicht dokumentiert. Basierend auf den Objekten, die im anderen Objekt enthalten sind. Wie berechnen wir nun den Speicherbedarf für unsere zwischengespeicherten Objekte?

Ich hatte dieses Thema zuvor in diesem Artikel angesprochen:

Wie berechnen wir nun den Speicherbedarf für unsere zwischengespeicherten Objekte? Nun, wie die meisten von Ihnen wissen, sind Int32 und float vier Bytes, double und DateTime 8 Bytes, char sind eigentlich zwei Bytes (nicht ein Byte) und so weiter. String ist etwas komplexer, 2 * (n + 1), wobei n die Länge des Strings ist. Für Objekte hängt es von ihren Mitgliedern ab: Fassen Sie einfach den Speicherbedarf aller ihrer Mitglieder zusammen, und denken Sie daran, dass alle Objektreferenzen einfach 4-Byte-Zeiger auf einer 32-Bit-Box sind. Nun, das ist eigentlich nicht ganz richtig, wir haben uns nicht um den Overhead jedes Objekts im Heap gekümmert. Ich bin mir nicht sicher, ob Sie sich darüber Sorgen machen müssen, aber ich nehme an, wenn Sie viele kleine Objekte verwenden, müssten Sie den Overhead berücksichtigen. Jedes Heap-Objekt kostet so viel wie seine primitiven Typen plus vier Bytes für Objektreferenzen (auf einem 32-Bit-Computer, obwohl BizTalk auch auf 64-Bit-Computern 32-Bit ausführt) plus 4 Bytes für den Typobjektzeiger, und ich denke 4 Bytes für den Synchronisationsblockindex. Warum ist dieser zusätzliche Aufwand wichtig? Stellen wir uns vor, wir haben eine Klasse mit zwei Int32-Mitgliedern. In diesem Fall beträgt der Speicherbedarf 16 Byte und nicht 8 Byte.

26
Aliostad

Nicht verwaltetes Objekt:

  • Marshal.SizeOf(object yourObj);

Werttypen:

  • sizeof(object val)

Verwaltetes Objekt:

26
NileshChauhan

Das folgende Codefragment sollte die Größe aller übergebenen Objekte in Byte zurückgeben, sofern sie serialisiert werden können. Ich habe dies von einem Kollegen bei Quixant erhalten, um ein Problem beim Schreiben an SRAM auf einer Spieleplattform zu lösen. Hoffe es hilft aus. Dank und Dank an 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

Im Debug-Modus

sOS laden

und führen Sie den Befehl dumpheap aus.

0
A.m.a.L