Perl verwaltet den Speicher automatisch: Variablen werden zerstört, wenn es keine Referenzen mehr auf sie gibt (Referenzzählung). Der Garbage Collector in Perl verwendet nicht den typischen tracing GC, sondern verlässt sich auf die Zählung der Referenzen.
Vorteile:
free(), wie in C).Nachteile und Fallstricke:
my $a = {}; my $b = {}; $a->{b} = $b; $b->{a} = $a; # Beide Variablen werden bei der Bereinigung nicht freigegeben, Perl kann sie nicht löschen
Um solche Probleme zu lösen, verwendet man das Modul Scalar::Util::weaken, das es ermöglicht, die Referenz zu "schwächen":
use Scalar::Util 'weaken'; my $a = {}; my $b = {}; $a->{b} = $b; weaken($b->{a} = $a);
Werden alle Perl-Objekte gelöscht, wenn alle expliziten Variablen auf sie entfernt werden, selbst wenn zwischen ihnen Referenzen bestehen?
Antwort: Nein! Wenn Objekte aufeinander verweisen (einen Zyklus bilden), wird Perl sie nicht löschen – es ist erforderlich, den Zyklus manuell zu durchtrennen oder die Verbindung über Scalar::Util::weaken zu schwächen.
Geschichte
Bei der Entwicklung eines langfristigen Daemons, der mit einer großen Anzahl von Verbindungen arbeitet, bemerkten die Programmierer die zirkuläre Referenz zwischen dem Objekt IoHandle und dem zugehörigen Ereignis-Handler nicht. Nach einigen Stunden Arbeit wuchs der Speicher exponentiell – nur eine Analyse mit Devel::Leak deckte das Problem auf.
Geschichte
Im ETL-Prozess beim Parsen großer Dateien führte die Ansammlung von Millionen temporärer Hash-Elemente zu einem "Stillstand" des Prozesses, selbst nachdem der Zyklus abgeschlossen war. Dies geschah, weil ein Element eine verschachtelte Referenz auf den Elternteil hielt (für dreistufige Verbindungen) und kein Speicher freigegeben wurde. Eine teilweise Umstrukturierung des Schemas half, das Leck zu vermeiden.
Geschichte
Programmierer verwendeten Closures in einer MapReduce-Engine, indem sie Kopien des Kontexts in anonymen Unterprogrammen speicherten. Diese Unterprogramme „leakten“ – der Speicher wurde nicht freigegeben, selbst nachdem die Batch-Aufgabe beendet wurde, da der Kontext Referenzen auf sich selbst enthielt. Sie fügten
undefhinzu, um eine ordnungsgemäße Zerstörung sicherzustellen.