C# Anzahl der Objekte die noch Speicher belegen auslesen

estre

Commander
Registriert
Dez. 2005
Beiträge
3.006
Hi,

gibt es in C# eine Möglichkeit am Programmende auszulesen wieviele Objekte noch den Speicher belegen und somit noch nicht freigegeben wurden ?

Danke!


Grüße
 
Korrigiere mich, wenn ich mich irre, aber hat C# nicht einen Garbace Collector wie Java, der sich um die Freigabe von Speicher kümmert?

Wieso willst du dann am Programmende wissen, was noch im Speicher ist? Der Garbage Colloctor wird am Programmende automatisch alle Objekte entfernen.
 
Wenn du den Grund schreiben würdest, warum das für dich wichtig ist, bekommst du vielleicht eher Hilfe...

@New_Escaflowne: Dass beim Programmende der Speicher aufgeräumt wird hat nicht mal was mit dem Garbage Collector zu tun...
 
Hi,

zunächst mal danke für eure Beiträge.

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.

Grüße
 
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 ?
 
Zuletzt bearbeitet:
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.
 
Zurück
Oben