Hilfe bei Speicher-Lecks


Thomas Wölfer
Thomas Wölfer

30. September 2004


Der Garbage Collector ist (für einen Programmierer mit C/C++ Hintergrund) einer der großen Vorteile der .Net CLR. Man erhält deutlich mehr Freiheiten beim programmieren, weil man sich eben nicht mehr darum kümmern muss Speicher auch wieder freizugeben.

Nur stimmt das leider nicht: Man kann auch in .Net Programmen prima Speicherlecks produzieren - und aufgrund bestimmter Funktionalitäten sind die sogar noch besser versteckt als das bei nativem Win32 Code der Fall ist.

Bei .Net tritt ein Speicherleck dann ein, wenn man unbeabsichtigterweise einen Zeiger auf ein Objekt behält: Solange diese Zeiger (diese 'Referenz') auf das Objekt besteht, kann das Objekt nicht garbage collected werden - und stellt effektiv ein Leck dar.

Das klingt zunächst nicht so dramatisch - aber man muss sich vergegenwärtigen, wie leicht man so eine Referenz erzeugen und vergessen kann: Angenommen Sie haben einen Eventhandler für ein bestimmtes Ereignis in einem anderen Objekt. Wenn Sie den nicht irgendwann wieder entfernen, dann bleibt die Referenz bestehen - und das 'andere' Objekt ist effektiv ein Speicherleck sobald es nicht mehr gebraucht wird. Genau, Sie haben richtig gelesen: Natürlich ist auch ein Eventhandler eine Referenz die dazu führt das der Garbage Collector nicht anspringt.

Solche Probleme sind schwer zu finden, es gibt aber Tools die dabei helfen. Zum Beispiel das hier: Der SciTech .NET Memory Profiler. Das Programm verschafft einen jede Menge interessante Einblicke - und ist mit 100 Dollarn auch nicht besonders teuer.