Wie viel Speicher verwendet ein C # /. NET-Objekt?
Bin ich eine Anwendung entwickeln, die derzeit über Hunderte von Objekten erstellt.
Ist es möglich, zu bestimmen (oder annähernd) den Speicher ein Objekt (Instanz der Klasse)?
Kommentar zu dem Problem
Wenn es nur Hunderte, warum sind Sie besorgt?
Ich beziehe mich auf eine Instanz einer Klasse, nicht die Klasse des Objekts.
@FerranB - ich denke, dass Anthony bedeutet, dass die Zuweisung Hunderte von Instanzen ist nicht wirklich eine große Sache, vorausgesetzt, Sie sind ziemlich typische Objekte und nicht massiven Dokumente oder arrays. Sie wahrscheinlich brauchen keine sorgen zu machen, es sei denn, du meintest 'zig Millionen' anstatt 'Hunderte'.
Einfache Instanzen kein problem. Aber Instanzen mit DataTables, DataGrids nicht egal?
@AnthonyWJones, hängt von der Größe der einzelnen Objekte...Windows win = new Fenster();
InformationsquelleAutor der Frage FerranB | 2009-01-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man einen memory-profiler wie
.NET Memory Profiler (http://memprofiler.com/)
oder
CLR Profiler (frei) (http://clrprofiler.codeplex.com/)
InformationsquelleAutor der Antwort Rauhotz
Einen groben Weg sein könnte, diese in-Fall Sie wissen wollen, was passiert mit einem bestimmten Objekt
Prozess weit Zeug könnte, die vielleicht so
hoffe, das hilft 😉
InformationsquelleAutor der Antwort varun
Den ANTS memory profiler wird Ihnen genau sagen, wie viel zugewiesen ist, für jedes Objekt/Methode/etc.
InformationsquelleAutor der Antwort George Stocker
Hier ist ein post , wo wir diskutierten über die Bestimmung der Größe der Referenz-Typen.
InformationsquelleAutor der Antwort John Sheehan
Können Sie auch verwenden WinDbg und entweder SOS oder SOSEX (wie SOS mit mit viel mehr Befehle und einige bestehende verbessert) WinDbg-Erweiterungen. Der Befehl, den Sie verwenden würden, um zu analysieren, ein Objekt an einer bestimmten Speicheradresse ist !objsize
Eine SEHR wichtige Sache zu erinnern ist, dass !objsize gibt dir nur die Größe der Klasse selbst und NICHT unbedingt die Größe der aggregierten Objekte, die innerhalb der Klasse - ich habe keine Ahnung, warum es dies nicht tut, da es ziemlich frustrierend und irreführend zu Zeiten.
Habe ich 2 Feature-Vorschläge auf der Connect-Webseite, Fragen Sie nach dieser Möglichkeit, aufgenommen zu werden in VisualStudio. Bitte Stimmen Sie für die Elemente, die Sie würde gerne sehen, wie Sie Hinzugefügt als gut!
https://connect.microsoft.com/VisualStudio/feedback/details/637373/add-feature-to-debugger-to-view-an-objects-memory-footprint-usage
https://connect.microsoft.com/VisualStudio/feedback/details/637376/add-feature-to-debugger-to-view-an-objects-rooted-references
EDIT:
Ich bin das hinzufügen der folgenden zu klären, ein paar Infos von der Antwort des Charles Bretana:
Nebenbei, es gibt ungefähr 8 verschiedene Haufen, die die CLR verwendet:
HTH
InformationsquelleAutor der Antwort Dave Black
Um eine Allgemeine Gefühl für die Zuweisung von Speicher in Ihrer Anwendung, verwenden Sie die folgende sos-Befehl in WinDbg
Beachten Sie, dass !dumpheap gibt nur die bytes von dem Typ des Objekts selbst, und nicht die bytes, die von einem anderen Objekt-Typen, die es möglicherweise auf.
Wenn Sie sehen möchten der insgesamt gehaltenen bytes (Summe aller bytes aller Objekte verwiesen wird, die von Ihrem Objekt) einer bestimmten Objekt-Typ, einen memory-profiler-wie dot Trace - http://www.jetbrains.com/profiler/
InformationsquelleAutor der Antwort Sean
Jede "Klasse" benötigt genug Speicher, um alle halten Sie den jit-kompilierten code für alle aktiven Mitglieder, die aufgerufen wurden, von der Laufzeit, (obwohl, wenn Sie don t Aufruf einer Methode seit geraumer Zeit, kann die CLR Version, Speicher-und re-jit es wieder, wenn Sie es rufen wieder... plus ausreichend Arbeitsspeicher für alle statischen Variablen in der Klasse deklariert... aber dieser Arbeitsspeicher ist nur einmal pro Klasse, egal wie viele Instanzen der Klasse, die Sie erstellen.
Für jede Instanz der Klasse, die Sie erstellen, (und wurde nicht von der Garbage Collection eingesammelt) Sie können annähernd den Speicherbedarf, indem die Speicherauslastung durch die einzelnen Instanz-basierten deklarierte variable... (Feld)
Referenz-Variablen (Referenzen auf andere Objekte) nehmen Sie 4 oder 8 Byte (32/64 bit OS ?)
int16, Int32, Int64 nehmen 2,4, oder 8 bytes, jeweils...
string-variable nimmt zusätzlichen Speicherplatz für einige meta-Daten-Elemente (plus die Größe der Adresse Zeiger)
Darüber hinaus jede Referenz-variable in ein Objekt könnte auch als "indirekt" enthalten die Speicher auf dem heap, indem Sie das Objekt, das es Punkte zu, obwohl Sie wahrscheinlich wollen, um zu zählen, dass der Speicher als zugehörig zu diesem Objekt ist keine variable, die darauf verweist,...
etc. etc.
InformationsquelleAutor der Antwort Charles Bretana
Wenn Sie können - zu Serialisieren!
InformationsquelleAutor der Antwort serhio
Dort ist die Akademische Frage, Was ist die Größe eines Objekts zur Laufzeit? Und, dass interessant ist, aber es kann nur richtig beantwortet von einem profiler, der an den Laufenden Prozess. Ich verbrachte eine ganze Weile auf der Suche, kürzlich und festgestellt, dass es keine generische Methode, die präzise und schnell genug, dass Sie jemals wollen würde, um es in einem Produktionssystem. Einfache Fälle wie arrays von numerischen Typen haben einfach Antworten, aber darüber hinaus dies die beste Antwort wäre nicht die Mühe zu versuchen, es herauszufinden. Warum wollen Sie das wissen? Gibt es andere Informationen zur Verfügung, könnte dem gleichen Zweck dienen?
In meinem Fall landete ich wollen, um diese Frage zu beantworten, da habe ich diverse Daten, die nützlich waren, aber konnte verworfen werden, um freien RAM mehr kritische Dienste. Die poster-boys hier sind ein Rückgängig-Stapel und ein Cache.
Schließlich Schloss ich, dass der richtige Weg, um die Größe des undo-stack und der cache wurde zur Abfrage der Größe des verfügbaren Speichers (es ist ein 64-bit-Prozess, so ist es sicher davon ausgehen, es ist alles vorhanden) und dann können weitere Elemente Hinzugefügt werden, wenn es eine ausreichend große Puffer-RAM und erfordern Elemente, die entfernt werden, wenn das RAM knapp wird.
InformationsquelleAutor der Antwort briantyler