Thread speicher freigeben (31 answers)
Opened by esskar at 2004-07-01 15:11

Gast Gast
 2004-07-02 17:49
#83807 #83807
[quote=Crian,02.07.2004, 14:44]Man kann der Garbage Collection helfen, indem man vor dem Löschen verschachtelter Strukturen innere Daten explizit freigibt, indem man sie auf undef setzt.

Wenn man sowas hat $hash{key}->[ fettes array ], kann man erstmal alle Werte auf undef setzen $hash{$_} = undef for keys %hash; bevor man dann das ganze Hash auf undef setzt oder aus dem Scope gehen lässt.

Eigentlich dürfte das der GC ja nur einen Schritt einsparen, aber in praktischen Anwendungsfällen hat gezeigt, dass der Unterschied wesentlich größer ist. Entweder habe ich das Problem falsch analysiert oder die GC verhält sich bei lang laufenden Perlprogrammen eigenartig. (Die Programme wurden nach mehreren Tagen immer langsamer...)[/quote]
Es gibt da einen Unterschied zwischen
- Perl GC
und
- System GC

Die Perl GC macht den nicht mehr verwendeten Speicher tatsächlich frei; wenn aber die System GC nicht auf die Aktionen der Perl GC reagiert (diese also ignoriert), dann werden den Perl-Speicheranforderungen immer wieder neue Systemresourcen zugewiesen.
Bei 'langlaufenden' Perl-Programmen ist es daher sehr angebracht, sowas wie einen 'Wrapper' zu schreiben der den Programm-Prozess (getaktet) abbricht, den aktuellen Programmzustand lokal speichert und dann das Programm (möglichst erst nach einer kurzen Auszeit), mit den persistenten Daten neu startet.
Diese Vorgehensweise ist zwar 'im Moment des Abbruchs' ein wenig teuer, führt aber letztendlich dazu dass die 'Gesamt-Performance' des Programms sich wesentlich verbessert weil der System GC die Möglichkeit gegeben wird sich zu regen.

View full thread speicher freigeben