Memory leak (unter Windows)

05/05/2008 - 12:09 von WebBird | Report spam
Hallo Perl-en,

ich habe eine komplexe Anwendung, die ein Memory leak zu haben
scheint. Zumindest steigt der Speicherbedarf wàhrend der Laufzeit
kontinuierlich, leider aber nicht in auch nur halbwegs
gleichbleibenden Sprüngen. Manchmal sind es nur ein paar Bytes, dann
wieder bis zu 2 kB oder mehr. Das klingt nicht nach viel, aber da das
Script wàhrend der Laufzeit tausende von Objekten bearbeiten soll,
macht das schon einiges aus. Ich weiß natürlich, daß Perl einmal
allokierten Speicher zurückbehàlt, aber ich denke, das allein ist es
nicht.

Ich bin dem guten Stück nun schon mit etlichen Devel:: Modulen zu
Leibe gerückt, aber mit ActivePerl hat man leider etwas schlechte
Karten. :( Eine andere Perl-Distribution (oder gar Linux) zu
verwenden, ist sicherlich eine gute Idee, aber leider auch mit sehr
viel Aufwand verbunden, weil ich Dutzende CPAN-Module compilieren
müßte, was sehr mühselig und zeitaufwendig ist. Bei Strawberry bin ich
an irgendeinem Modul gescheitert, das nicht compilieren wollte... ich
glaube es war DBD::mysql, aber nagelt mich bitte nicht drauf fest. ;)

Hat vielleicht noch jemand einen guten Tipp auf Lager, wie man mit den
etwas eingeschrànkten Möglichkeiten unter ActivePerl der Sache auf den
Grund gehen könnte? Ich habe schon etliche Artikel er-google-t und
auch einiges gefunden, konnte auch schon ein paar Fehler im Code
bereinigen, aber die Anwendung "leckt" immer noch. :( Ich vermute den
Fehler in einem Treibermodul, das wiederum Rose::DB::Object verwendet,
aber das ist selbst so umfangreich, daß ich da irgendwie nicht weiter
komme.

Hier noch ein paar Beispiele, was ich schon alles probiert habe:

Devel::Leak::Object
-> Half mir herauszufinden, daß ich für jede abgefragte Zeile der
Datenbank ein Bündel Objekte im Speicher behielt. Jetzt bleiben am
Ende des Scriptlaufs nur die Objekte übrig, von denen ich das auch
erwarten würde. (Tipp: Bei der Benutzung von RDBO _extrem_ darauf
achten, wie man die Objekte benutzt! Da gibt es etliche
Stolperfallen!)

Devel::Monitor
-> Hiermit habe ich ein paar Stellen gefunden, an denen Variablen im
Speicher blieben, obwohl man das eigentlich nicht erwarten würde.
Meine Empfehlung: Bei RDBO nicht in dieser Form z. B. über
Tabellenspalten iterieren, obwohl es so in der Doku und etlichen
Beitràgen der ML zu finden ist:

foreach my $column ( $object_ref->meta->columns ) { ... }

Bei jedem Durchlauf bleibt $column im Speicher und wird erst beim
Beenden des Scripts wieder frei. Bei 46 Spalten pro Durchlauf ist das
übel... Folgende Lösung behebt das Problem:

my @columns = $object_ref->meta->columns;
foreach my $column ( @columns ) { ... }

(Verstanden hab ich das allerdings nicht...)

Devel::Size
-> Hat mir bewiesen, daß verdàchtige Variablen/Referenzen teilweise
tatsàchlich anwuchsen. Nun habe ich aber alle durch, die verdàchtig
waren, und der Speicherbedarf wàchst immer noch.

Data::Structure::Util
-> War bisher nicht sooo hilfreich, weil es wie die meisten einen
Haken hat: Man muß schon wissen, wo man das Problem vermutet. Und die
Stellen hab ich, wie gesagt, jetzt alle durch.

Devel::Leak
-> Zeigt mir, daß der RDBO-Treiber "leckt", aber das wußte ich vorher
auch schon...

Danke und Gruß,
Bianka
 

Lesen sie die antworten

#1 J. Strübig
05/05/2008 - 12:53 | Warnen spam
WebBird schrieb:
ich habe eine komplexe Anwendung, die ein Memory leak zu haben
scheint.



Ich habe zwar keine Antwort, aber mir stellen sich ein paar Fragen: In
was für einem Umfeld findet das alles statt? Ist das eine CGI oder
mod_perl Anwendung? Oder arbeitest du mit einer grafischen Oberflàche,
wie z.b. Tk? Und wie hast du das Speicherloch festgestellt?

Struppi.

Ähnliche fragen