Schrift
[thread]6373[/thread]

speicher freigeben

Leser: 2


<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten
esskar
 2004-07-01 15:11
#83799 #83799
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hi.

- perl-programm läuft als service
- was muss ich alles freigeben
- wie kann ich sicher gehen, dass ich keinen speicher vergesse
- etcpp.

schreit einfach alles raus, was ihr zu dem thema wisst!

danke!
renee
 2004-07-02 00:12
#83800 #83800
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mache die Scopes, in denen die Variablen gültig sind möglichst klein. Wenn eine Variable nicht mehr gültig ist (, das Programm aus dem Scope geht), dann wird der Speicher wieder freigegeben!

Dafür dann am besten auch mitten im Programm einfach mal Blockklammern setzen....
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Elderian
 2004-07-02 12:52
#83801 #83801
User since
2004-06-29
5 Artikel
BenutzerIn
[default_avatar]
Heya,

soweit ich das Konzept von Perl verstanden habe, musst Du Dich (im Gegensatz zu C/C++) nicht um das allokieren und freigeben von Speicher kümmern, das macht der Interpreter bzw. die Vitrual Machine selbst.

Ansonsten gelten die üblichen Regeln: Aufpassen, dass die Arrays/Hashes etc. nicht ins endlose wachsen, (wie der Vorposter schon erwähnte) die Scopes relativ eng setzen, keine Fehler machen! ;)

In Java konnte man (iirc) die Garbage Collection per Hand anstossen. Ist das mit Perl auch möglich?

Elderian
busunsl
 2004-07-02 14:55
#83802 #83802
User since
2004-07-02
5 Artikel
BenutzerIn
[default_avatar]
Eins sollte nicht vergessen werden, Speicher, der einmal von Perl vom Betriebssystemangefordert wurde, wird nicht mehr zurückgegeben.
Du kannst also soviele Hashes und Arrays löschen, wie Du willst, Dein Programm behält den Speicher alloziert. Er wird allerdings intern wiederverwendet, sofern nötig.

Bernd
<a href=http://www.perlmonks.org/index.pl?node_id=61798>busunsl@perlmonks.org</a>
renee
 2004-07-02 15:20
#83803 #83803
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn man aber die Hashes und Arrays löscht, dann wird der Speicher wiederverwendet. Somit wird erst gar nicht so viel Speicher angefordert...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2004-07-02 16:44
#83804 #83804
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
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...)\n\n

<!--EDIT|Crian|1088772606-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
esskar
 2004-07-02 17:00
#83805 #83805
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=renee,02.07.2004, 13:20]Wenn man aber die Hashes und Arrays löscht, dann wird der Speicher wiederverwendet. Somit wird erst gar nicht so viel Speicher angefordert...[/quote]
heißt löschen undef'en oder reicht ein out-of-scope fallen?
renee
 2004-07-02 17:03
#83806 #83806
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
es reicht ein out-of-scope.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
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.
ptk
 2004-07-02 18:16
#83808 #83808
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Auf jeden Fall muss man auf zirkulaere Referenzen achten, da diese vom reference counting system nicht automatisch aufgeloest werden koennen. Wenn du weisst, dass du eine zirkulaere Referenz erzeugst, solltest du eine der beiden Referenzen mit Scalar::Util::weaken bearbeiten.

Ein Tool zum Aufspueren von Memory Leaks ist Devel::Peek (benoetigt in der Regel das Neuuebersetzen von Perl). Damit kann man nachzaehlen lassen, wie viele Skalare Perl zwischen verschiedenen Checkpoints verbraucht.

Ansonsten hat man die gleichen Probleme wie beim Verwenden von malloc() bei C: wenn man grosse Speicherbloecke alloziert, werden diese nach einem free() unter Umstaenden nicht an das Betriebssystem zurueckgegeben. In diesem Fall waere es besser, die speicherfressende Funktion in einen eigenen Prozess zu verlagern.
<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten



View all threads created 2004-07-01 15:11.