38 votes

Comment puis-je trouver des fuites de mémoire dans un programme Perl de longue durée?

Perl utilise le comptage de références pour GC, et il est assez facile de faire une référence circulaire par accident. Je vois que mon programme semble utiliser de plus en plus de mémoire, et il débordera probablement après quelques jours.

Existe-t-il un moyen de déboguer les fuites de mémoire en Perl? Attacher à un programme et obtenir un nombre d'objets de différents types serait un bon début. Si je savais quels objets sont beaucoup plus nombreux que prévu, je pourrais vérifier toutes les références à eux et, espérons-le, corriger la fuite.

37voto

geocar Points 5915

Il peut être pertinent que Perl ne jamais donne de la mémoire pour le système en lui-même: Il est tout à malloc() et de toutes les règles associées avec qui.

Sachant malloc() alloue de la mémoire est important de répondre à la grande question, et il varie d'un système à l'autre, mais en général la plupart des malloc() des implémentations optimisées pour les programmes de l'allocation et la désallocation de la pile-comme des ordres. Perl utilise le comptage de références pour le suivi de la mémoire, ce qui signifie que deallocations qui signifie (à la différence d'une table de base de la langue qui utilise malloc() - dessous), il est en fait pas si difficile de dire où la désallocation va se produire, et dans quel ordre.

Peut-être que vous pouvez réorganiser votre programme afin de profiter de cet état de fait - en appelant undef($old_object) explicitement - et dans le bon ordre, d'une manière similaire à la façon dont C-programmeurs dire free(old_object);

Pour les programmes de longue date (jours, mois, etc), où j'ai plein de chargement/copier/dump cycles, j'ai déchets-collecte à l'aide de exit() and exec(), et où il otherwide, impossible, j'ai tout simplement emballer mes structures de données (à l'aide d' Storable) et les descripteurs de fichiers (à l'aide d' $^F) et exec($0) - le plus souvent avec une variable d'environnement définie comme $ENV{EXEC_GC_MODE}, et vous pouvez avoir besoin de quelque chose de similaire , même si vous n'avez pas de fuites de votre propre simplement parce que Perl est une fuite de petits morceaux de votre système malloc() peut pas comprendre comment le donner en retour.

Bien sûr, si vous avez des fuites dans votre code, puis le reste de mon avis est un peu plus pertinent. Il a été affecté à une autre question sur ce sujet, mais il n'a pas explicitement couvrir les programmes de longue date.


Tous les programmes perl fuites de mémoire soit à une XS tenant sur une référence, ou une circulaire de la structure de données. Devel::Cycle est un excellent outil pour trouver des références circulaires, si vous savez ce que les structures sont susceptibles de contenir des boucles. Devel::Peek peut être utilisé pour trouver des objets avec une hausse plus forte que prévu de comptage de référence.

Si vous ne savez pas où chercher, Devel::LeakTrace::Rapide pourrait être un bon endroit, mais vous aurez besoin d'un perl construit à des fins de débogage.

Si vous soupçonnez une fuite à l'intérieur XS-espace, il est beaucoup plus difficile, et Valgrind sera probablement votre meilleur pari. Test::Valgrind peut vous aider à réduire la quantité de code que vous avez besoin de chercher, mais cela ne fonctionne pas sur Windows, de sorte que vous auriez à le port (au moins la fuite de la partie) pour Linux pour ce faire.

5voto

Jesse Points 111

Devel :: Gladiator est un autre outil utile dans cet espace.

3voto

Craig H Points 4224

On dirait que le module cpan Devel :: Cycle est ce que vous recherchez. Cela nécessite d'apporter quelques modifications à votre code, mais cela devrait vous aider à trouver vos références sans trop de problèmes.

3voto

Yuval F Points 15248

valgrind est une excellente application Linux, qui localise les fuites de mémoire dans le code en cours d'exécution. Si votre code Perl s'exécute sur Linux, vous devriez le vérifier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X