Re: Heap betrachten?

Tech Tip: Click here to run a free scan for Windows Errors and optimize PC performance



Okay, dann kann ich das mit IDisposable mal sein lassen, da es bei mir nur
um verwalteten Krams geht.

Vielleicht hast du ja aber noch einen Tip, wie ich mein Problem in den Griff
bekomme:
Ich habe in die finalize-Methode ein Print.Debug reingeschriegen, damit ich
sehe, dass das dazugehörige Objekt auch tatsächlich 'weg' ist. Und ich habe
da einen Button (nur zum Testen natürlich), mit dem ich GC.Collect jederzeit
ausführen kann. Ich kann nun halt sehen, dass der finalizer nicht ausgeführt
wird, weil keine Debug-Meldung kommt, und daher weiß ich doch jetzt, dass
das Objekt scheinbar noch nicht von allen freigegeben wurde. Wie bekomme ich
jetzt heraus, wer das Objekt noch referenziert? Ich schaue mir jetzt seit
Stunden den Code an, aber ich komme nicht drauf. Und ich meine, dass
eigentlich alles soweit richtig sein sollte, aber vielleicht übersehe ich
doch was. Oder der Garbage Collector erkennt vielleicht doch nicht so
richtig, dass er etwas freigeben kann. Obwohl, wenn ich das Programm beende,
dann werden aber doch noch die finalize-Methoden aufgerufen. Das kann ich
dann sehen.

Hat jemand eine Idee? Muss ich mich darum kümmern? Wohl schon, oder sonst
läuft mir vielleicht der Speicher voll !?

Danke.

Robert


--
E-Mail: r._sch_nei_d_er#_we_ingar_t_ner.c_om
(remove each '_' from the address and replace '#' with '@')


"Karsten Sosna" <k.sosna-NO-SPAM-@xxxxxxxxxxx> schrieb im Newsbeitrag
news:eWI1k5DZGHA.1352@xxxxxxxxxxxxxxxxxxxxxxx
Normalerweise solltest du gar nicht mit 'GC.Collect' hantieren müssen.
Wenn die Klassen 'IDisposable' implementieren, ist es ratsam, die
'Dispose'-Methode der Objekte aufzurufen, wenn diese nicht mehr benötigt
werden. In VB 2005 kann dies durch Verwendung von 'Using'-Blöcken
vereinfacht werden.

Ja, bin da noch nicht so der Profi. Was ist denn, wenn mein Objekt nicht
IDisposable implementiert?

Robert,
IDisposable brauchst Du nur um unverwaltete Resourcen freizugeben. Wenn Du
keine benutzt brauchst Du auch kein Dispose. Wenn der GC feststellt dass
ein Object nicht mehr benötigt ruft er Dispose auf, wann das passiert ist
aber nicht vorhersehbar, daher sollte der Nutzer der Klasse Dispose
aufrufen damit die Resourcen wieder freigegeben werden. Bspw. öffnenst Du
einen Stream in der Klasse. Dieser Stream wird aber nicht sofort
geschlossen, wenn die Objektvariable ihren Gültigkeitsbereich verlässt.
Damit ist evtl. kein weiterer Zugriff auf die bspw. Datei möglich. Anderes
Beispiel. Deine Klasse benutzt das Graphics-Object und holt sich den
DeviceContext. Solange diese Klasse das Handle nicht wieder freigibt kann
der Nutzer der Klasse das Graphics-Object nicht mehr nutzen. Sicherlich
könnte Deine Klasse Methoden implementieren, die einzelne Resourcen
freigibt. Das ist aber nicht im Sinn einer Klasse. Sie sollte ihre
Funktionalität kapseln und nicht benötigte Resourcen sofort wieder
freigeben.

Aber nochmal die Frage: Gibt es eine Möglichkeit sich den Heap
anzuschauen?

Das nutzt Dir überhaupt nichts, da Du daran nicht erkenen kannst wer ein
Object refrenziert. Deine Anfrage "Wie kann ich herausfinden, was das
Freigeben verhindert?" Suche mal über Google nach "transparente
animation". Ich habe dort u.a. beschrieben beschrieben wie man feststellen
kann, dass eine Resource (noch) nicht freigeben wurde.
--
Gruß Scotty




.


Quantcast