Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
C#Anzahl der Objekte die noch Speicher belegen auslesen
Und zwar habe ich eine Klasse entworfen die 2 Eigenschaften besitzt und jeweils mit gettern und settern ausgestattet ist.
Nun durchlaufe ich eine Schleife (mit z.B. 300.000 Durchläufen), und erzeuge pro Schleifendurchlauf ein neues Objekt und adde die Objekte dann in eine Liste.
Am Ende möchte ich eine Liste mit x Objekten haben, wobei jedes Objekt einen anderen Wert für eine bestimmte Eigenschaft besitzt.
An einem kleinen Beispiel wird es deutlicher:
Code:
// ComSettingsManager ist meine Klasse mit ihren Eigenschaften und den gettern und settern
List<ComSettingsManager> comList = new List<ComSettingsManager>();
int s = 1;
for (int i = 0; i <= 300000; i++)
{
ComSettingsManager ComAdminObjekt = new ComSettingsManager();
ComAdminObjekt.SetIntPID(s);
comList.Add(ComAdminObjekt);
s++;
}
Das Problem ist nun, dass dieser Vorgang ziemlich viel Speicher frisst und ich rein aus Interesse mal wissen wollte wie das mit den Objekten und deren Speicherreferenzierung aussieht.
Na da wird ein Profiler (CLR-Profiler wäre kostenlos) wohl die beste Lösung sein, weil die Dinger genau für sowas gemacht sind.
Wenn dus trotzdem selbst coden willst, dann ruf doch vor und nach dem Schleifendurchlauf GC.GetTotalMemory() auf und vergleich die Werte.
Wobei du beachten solltest, das GetTotalMemory u.U. nicht besonders genau ist.
@Grantig
Danke, ich werde das mal so ausprobieren!
Eine grundsätzliche Frage habe ich noch. Und zwar erzeuge ich ja in jedem Schleifendurchlauf ein Objekt, das ComAdminObjekt heisst.
Wieso gibt es da keinen Namenskonflikt? Mich hat es sehr gewundert, dass es so funktioniert hat, ich kann doch nicht x-tausend gleichnamige Objekte anlegen`?!
edit:
Ok, also der Tipp mit der GetTotalMemory-Methode war schonmal richtig gut.
Ich habe die Methode jeweils zum Programmstart und –Ende aufgerufen. Für 300000 Objekte wird nur 8MB Ram verbraucht.
Nachdem das Programm beendet wurde werden die Objekte ja sowieso getötet und der Speicher ist automatisch wieder freigegeben, oder ?
Weil ComAdminObjekt nicht der Name des Objekts ist, sondern nur dein Variablenname. Und der Name/die Variable ist nur in dem Block gültig in dem sie definiert wurde, also nur innerhalb deines Schleifenrumpfes.
Dein Variablenname interessiert die CLR überhaupt nicht. In deiner Liste werden nämlich keine Namen o.Ä. gespeichert, sondern Referenzen auf deine erzeugten Objekte.
Der Speicher wird freigegeben, sobald keine Referenz mehr auf ein Objekt existiert.
Der .NET Garbage Collector findet Objekte die nicht referenziert werden automatisch und gibt den Speicher frei.
Beim Beenden der Anwendung räumt die CLR dann sowieso den kompletten Speicher frei, den dein Programm belegt hat.