Perl, bellek yönetimini otomatik olarak gerçekleştirir: Değişkenler, onlara referans kalmadığında yok edilir (referans sayımı). Perl'deki çöp toplayıcı, tipik bir izleme GC kullanmaz ve referans sayısına dayanır.
Avantajlar:
free() ile).Dezavantajlar ve tuzaklar:
my $a = {}; my $b = {}; $a->{b} = $b; $b->{a} = $a; # Her iki değişken de temizleme sırasında serbest bırakılmaz, perl bunları kaldırmaz
Bu tür sorunları çözmek için Scalar::Util::weaken modülü kullanılır; bu, referansı "zayıflatmayı" sağlar:
use Scalar::Util 'weaken'; my $a = {}; my $b = {}; $a->{b} = $b; weaken($b->{a} = $a);
Perl üzerindeki tüm açık değişkenler silindiğinde, içlerinde referanslar olsa bile herhangi bir nesne ortadan kaldırılır mı?
Cevap: Hayır! Eğer nesneler birbirine referans veriyorsa (döngü oluşturuyorlarsa), Perl bunları silmez — döngüyü manuel olarak kırmak veya Scalar::Util::weaken aracılığıyla bağı zayıflatmak gerekecektir.
Hikaye
Büyük sayıda bağlantıyla çalışan uzun süreli bir demon geliştirirken, programcılar IoHandle nesnesi ile bağlı olay işleyicisi arasında döngüsel bir referansı fark etmemişlerdi. Birkaç saat çalıştıktan sonra bellek üssel olarak büyümüştü — sadece Devel::Leak ile yapılan analiz sorunu ortaya çıkardı.
Hikaye
Büyük dosyaların ETL sürecinde, milyonlarca geçici hash öğesi birikmesi, döngü tamamlandıktan sonra bile sürecin "donmasına" neden oluyordu. Bu, bir öğenin üst düzeydeki referansına yönelik yerleşik bir referansı saklıyor olmasından kaynaklanıyordu (üç seviyeli bağlantılar için) ve bellek serbest bırakılmıyordu. Şemanın kısmi yeniden yapılandırması sızıntıyı önlemeye yardımcı oldu.
Hikaye
Programcılar MapReduce motorunda, bağlamın kopyalarını anonim alt programlarda saklayarak kapalama kullandılar. Bu alt programlar “sızdı” — bellek, batch görevlerinin sonlanmasından sonra bile serbest bırakılmadı, çünkü bağlam, kendilerine referanslar içeriyordu. Doğru imha için açık bir
undefeklendi.