Perl'de bellek yönetimi, yorumlayıcı düzeyinde otomatikleştirilmiştir. Tarihsel olarak, Perl başlangıçtan itibaren programcının açıkça bellek yönetimi yapmaması için tasarlanmış bir dil olarak yaratılmıştır, böylece algoritmalara odaklanabilir. Kaynakların serbest bırakılması otomatik olarak gerçekleşir, ancak mekanizmanın çalışma ayrıntılarını ve sınırlamalarını her geliştiricinin bilmesi gerekir.
Konu Tarihi:
Perl'in ilk sürümlerinden itibaren dilin geliştiricileri, bellek tahsisini dinamik olarak yapmayı ve nesneye referans kalmadığında belleği sisteme geri döndürmeyi seçti. Bu, referans sayma (reference counting) olarak adlandırılır.
Sorun:
Temel incelik, mekanizmanın döngüsel referansları görmemesidir. İki yapı birbirine referans verirse, hiçbiri referans sayısında "sıfır" değerine ulaşamaz ve bellek serbest bırakılmaz.
Çözüm:
Perl, her nesne ve değişken için yerleşik bir referans sayıcı kullanır. Sayıcı sıfıra düştüğünde, bellek otomatik olarak serbest bırakılır. Döngüsel referanslarla başa çıkmak için, referans sayaçlarını artırmayan "zayıf" referanslar oluşturmak üzere Scalar::Util::weaken modülünün kullanılması önerilir veya döngüler elle kesilmelidir.
Kod örneği:
use Scalar::Util 'weaken'; my $a = {}; my $b = { parent => $a }; $a->{child} = $b; weaken($a->{child});
Anahtar özellikler:
Scalar::Util::weaken, Devel::Cycle).Perl, Java'nın yaptığı gibi döngüsel referansları otomatik olarak garbage collection ile kaldırabilir mi?
Hayır. Standart Perl 5 uygulamasında tam bir garbage collector yok, yalnızca referans sayma vardır. Döngüsel referanslar yalnızca elle serbest bırakılabilir.
Eğer bir skalar veya anonim yapıda undef yapılırsa, değişkenin belleğiyle ne olur?
undef operatörü referans sayısını azaltır. Diğer referanslar kalmadıysa bellek serbest bırakılır. Ancak, hala referanslar varsa (örneğin, diğer yapılardan), nesne bellekte kalır.
my $a = []; my $b = $a; undef $a; # $b hala referans veriyor — bellek serbest bırakılmadı
Değişken görünümden çıktığında, bellek her zaman serbest bırakılır mı?
Hayır, eğer nesne döngüsel referansa dahilse veya global bir referans varsa, bellek tüm dış bağlantılar ortadan kaldırılmadıkça serbest bırakılmaz.
Dizin ağaçlarını saklıyoruz, burada her düğüm bir ebeveyn ve çocuk referansı tutmaktadır. Zayıf referanslar kullanmıyoruz. Bellek, program sona erene kadar serbest bırakılmıyor.
Artılar:
Eksiler:
Ebeveyn referansı için Scalar::Util::weaken kullanarak referans miktarını artırmadan ilişkiyi oluşturuyoruz, bellek tam olarak gerekli kadar ayrılır.
Artılar:
Eksiler: