Perl gère la mémoire automatiquement : les variables sont détruites lorsqu'il n'y a plus de références (compte des références). Le ramasse-miettes en Perl n'utilise pas le GC typique de traçage, mais compte sur le dénombrement des références.
Avantages :
free(), comme en C).Inconvénients et pièges :
my $a = {}; my $b = {}; $a->{b} = $b; $b->{a} = $a; # Les deux variables ne sont pas libérées lors du nettoyage, perl ne peut pas les supprimer
Pour résoudre ces types de problèmes, on utilise le module Scalar::Util::weaken, qui permet de "affaiblir" la référence :
use Scalar::Util 'weaken'; my $a = {}; my $b = {}; $a->{b} = $b; weaken($b->{a} = $a);
Les objets Perl sont-ils éliminés lors de la suppression de toutes les variables explicites les référant, même s'il y a des références entre eux ?
Réponse : Non ! Si les objets se réfèrent entre eux (créent un cycle), Perl ne les supprimera pas — il faudra couper le cycle manuellement ou affaiblir la référence via Scalar::Util::weaken.
Histoire
Lors du développement d'un démon à long terme, traitant un grand nombre de connexions, les programmeurs n'ont pas remarqué la référence circulaire entre l'objet IoHandle et le gestionnaire d'événements associé. Après quelques heures de fonctionnement, la mémoire augmentait de manière exponentielle — seul une analyse avec Devel::Leak a révélé le problème.
Histoire
Dans le processus ETL de parsing de gros fichiers, l'accumulation de millions d'éléments temporaires de hachage entraînait un "gel" du processus même après la fin de la boucle. Cela s'est produit parce qu'un des éléments maintenait une référence imbriquée vers le parent (pour des relations à trois niveaux) et la mémoire n'était pas libérée. Une restructuration partielle du schéma a aidé à éviter la fuite.
Histoire
Les programmeurs utilisaient des closures dans un moteur MapReduce, maintenant des copies de contexte dans des sous-programmes anonymes. Ces sous-programmes « fuyaient » — la mémoire n'était pas libérée même après la fin d'un travail par lots, car le contexte contenait des références à lui-même. Ils ont ajouté un
undefexplicite pour une destruction correcte.