Perl gestisce automaticamente la memoria: le variabili vengono distrutte quando non ci sono più riferimenti su di esse (reference counting). Il garbage collector in Perl non utilizza il tipico tracing GC, ma si basa sul conteggio dei riferimenti.
Vantaggi:
free(), come in C).Svantaggi e insidie:
my $a = {}; my $b = {}; $a->{b} = $b; $b->{a} = $a; # Entrambe le variabili non vengono liberate durante la pulizia, perl non può eliminarle
Per risolvere problemi simili si utilizza il modulo Scalar::Util::weaken, che consente di "indebolire" il riferimento:
use Scalar::Util 'weaken'; my $a = {}; my $b = {}; $a->{b} = $b; weaken($b->{a} = $a);
Vengono distrutti tutti gli oggetti Perl quando tutte le variabili esplicite su di essi vengono rimosse, anche se ci sono riferimenti reciproci tra di loro?
Risposta: No! Se gli oggetti si riferiscono l'uno all'altro (creano un ciclo), Perl non li eliminerà — sarà necessario rompere manualmente il ciclo o indebolire il riferimento tramite Scalar::Util::weaken.
Storia
Durante lo sviluppo di un demone a lungo termine che gestisce un gran numero di connessioni, i programmatori non hanno notato il riferimento ciclico tra l'oggetto IoHandle e il gestore di eventi associato. Dopo alcune ore di funzionamento, la memoria cresceva esponenzialmente — solo un'analisi con Devel::Leak ha rivelato il problema.
Storia
Nel processo ETL di parsing di grandi file, l'accumulo di milioni di elementi temporanei dell'hash ha portato a un "blocco" del processo anche dopo la fine del ciclo. Questo è successo perché uno degli elementi manteneva un riferimento nidificato al genitore (per relazioni a tre livelli) e non avveniva la liberazione della memoria. Una parziale ristrutturazione dello schema ha aiutato a evitare la perdita.
Storia
I programmatori utilizzavano chiusure nel motore MapReduce, mantenendo copie del contesto in funzioni anonime. Queste funzioni "perdevano" memoria — non veniva liberata nemmeno dopo la fine dell'attività batch, poiché il contesto conteneva riferimenti a se stesso. È stato aggiunto un esplicito
undefper una corretta distruzione.