Christian Seiler: Speicherfresser - Oder wie beende ich einen Thread richtig?

Beitrag lesen

Hallo Frank,

Also: Warum frisst ein Thread, der als Funktion gestartet wurde und der mit der "preferred method" ExitThread beendet wurde, Speicher?

Naja, was heißt hier "freigegeben"? Ich vermute mal einfach stark, dass der Speicher lediglich wieder dem Programm zur Verfügung steht, nicht dem Betriebsystem. Ich kenne mich mit Windows-Interna nicht so wirklich aus, daher erkläre ich Dir mal, wie's unter Linux aussieht, unter Windows sieht es mit Sicherheit fast genauso aus.

Unter Linux kann ein Programm per Funktion malloc() dynamisch Speicher vom Betriebsystem anfordern und per free() wieder freigeben. malloc() ist allerdings *keine* Systemfunktion. Diese Funktion ruft nämlich selbst die Systemfunktion brk() auf, die den Heap eines Prozesses vergrößern kann. Die Funktion malloc() unerhält im Heap des Programms einen Speicherpool. Fordert ein Programm nun Speicher per malloc() an, wird geschaut, ob der Speicherpool groß genug ist, wenn ja, wird ein Zeiger aus dem Speicherpool zurückgegeben, wenn nein, wird brk() aufgerufen, um den Heap zu vergrößern. Wird nun der Speicher per free() wieder freigegeben, wird dieser Speicherblock dem Speicherpool wieder zugewiesen - was jedoch *nicht* geschieht ist, dass der Heap wieder verkleinert wird - der bleibt so groß. Für das Betriebsystem (es weiß ja nicht, wie das Programm intern seinen Speicher verwendet) sieht es so aus, als ob das Programm den Speicher noch verwenden würde. Wenn das Programm nun erneut Speicher anfordert, wird zuerst der Speicher verwendet, der bereits vom Programm reserviert wurde - und nur, falls dieser ausgehen sollte, wird mehr Speicher verwendet.

Bei Dir scheint genau das der Fall zu sein: Du hast am Anfang sehr viele Threads, die viel Speicher fressen, die beenden sich dann und der Speicher bleibt vom Programm genutzt - das Programm nutzt aber im weiteren Verlauf nicht mehr so viel Speicher, dass es diese Grenze wieder verschieben könnte - der Speicherverbrauch bleibt dann für die restliche Ausführungszeit konstant.

Viele Grüße,
Christian