Perl beheert het geheugen automatisch: variabelen worden vernietigd wanneer er geen verwijzingen meer naar zijn (referentietelling). De garbage collector in Perl gebruikt geen typische tracing GC, maar vertrouwt op referentietelling.
Voordelen:
free(), zoals in C).Nadelen en valkuilen:
my $a = {}; my $b = {}; $a->{b} = $b; $b->{a} = $a; # Beide variabelen worden niet vrijgegeven bij opruimen, perl kan ze niet verwijderen
Om dergelijke problemen op te lossen, wordt de module Scalar::Util::weaken gebruikt, die in staat stelt om een verwijzing te "verzwakken":
use Scalar::Util 'weaken'; my $a = {}; my $b = {}; $a->{b} = $b; weaken($b->{a} = $a);
Worden alle Perl-objecten vernietigd wanneer alle expliciete variabelen naar ze worden verwijderd, zelfs als er interne verwijzingen tussen hen zijn?
Antwoord: Nee! Als objecten naar elkaar verwijzen (een cyclus creëren), zal Perl ze niet verwijderen — het is nodig om de cyclus handmatig te doorbreken of de verbinding te verzwakken via Scalar::Util::weaken.
Verhaal
Bij de ontwikkeling van een langdurige daemon die met een groot aantal verbindingen werkt, zagen programmeurs de circulaire verwijzing tussen het IoHandle-object en de bijbehorende gebeurtenis handler niet. Na enkele uren werk groeide het geheugen exponentieel — alleen een analyse met Devel::Leak onthulde het probleem.
Verhaal
In het ETL-proces van het parseren van grote bestanden leidde de accumulatie van miljoenen tijdelijke hash-elementen tot het "bevriezen" van het proces, zelfs na de voltooiing van de cyclus. Dit gebeurde omdat een van de elementen een geneste verwijzing naar de ouder bewaarde (voor drie niveaus van verbindingen) en er geen geheugen vrijgave plaatsvond. Gedeeltelijke herstructurering van de schema hielp om het lek te voorkomen.
Verhaal
Programmeurs gebruikten closures in de MapReduce-engine, waarbij ze kopieën van de context in anonieme subroutines bewaarden. Deze subroutines "lekte" — geheugen werd niet vrijgegeven, zelfs niet na de voltooiing van de batch-taak, omdat de context verwijzingen naar zichzelf bevatte. Een expliciete
undefwerd toegevoegd voor correcte vernietiging.