Perl'de değişkenler ve veri yapıları için bellek yönetimi referans sayımı mekanizmasıyla yapılır. Bir nesne veya yapı, referans sayısı sıfıra düştüğünde serbest bırakılır.
Ancak bu mekanizma döngüsel referansları TESPİT ETMEZ. Eğer nesneler birbirine referans veriyorsa, referans sayıları sıfıra ulaşmaz ve bellek serbest bırakılmaz.
Döngüsel referansların temizlenmesi için şunlar kullanılır:
Scalar::Util::weaken modülü üzerinden. Zayıf bir referans, referans sayısını artırmaz ve başka güçlü referanslar yoksa GC nesneyi serbest bırakabilir.Zayıf referans oluşturma örneği:
use Scalar::Util 'weaken'; my $parent = {}; my $child = { parent => $parent }; $parent->{child} = $child; weaken($child->{parent}); # şimdi parent->child->parent temizlemeye engel olmaz
Perl, Scalar::Util modülü veya elle müdahale olmadan döngüsel referansları "tanıyıp" serbest bırakabilir mi?
Hayır, Perl varsayılan olarak döngüsel yapıları otomatik olarak "toplayamaz," çünkü bu mekanizma nesne grafiğinin analizini gerektirir (örneğin, JVM veya Python'da olduğu gibi GC). Bu yüzden döngülerin temizlenmesini her zaman kendiniz sağlamalısınız.
Hikaye
Bir web uygulamasının oturum depolama sunucusunda iki yönlü ilişkilere sahip User nesneleri aktif bir şekilde kullanıldı. Binlerce erişimden sonra, bellek sürecinin döngüler nedeniyle arttığı ortaya çıktı: $user->{session}->{user} = $user. Geri referanslar için weaken kullanımı ile bellek sızıntısı ortadan kalktı.
Hikaye
LRU algoritması ile önbellek kullanıldığında, nesnelerin birbiriyle referanslar aracılığıyla zincirleme bağı kuruldu. Geliştiriciler, bağlantıları manuel olarak sıfırlamayı düşünmemişlerdi, bu da servis birkaç gün çalıştıktan sonra bellek artışına ve OOM'dan çökmesine neden oldu.
Hikaye
Bir belgesel mikro servisinde raporlar oluşturulurken döngüsel referanslara sahip büyük ölçekli veri yapıları ile eval kullanıldı. Geliştiriciler Perl'in otomatik çöp toplama mekanizmasına güveniyorlardı, ama sunucu eski nesneleri "hatırlıyordu" ve bir haftalık çalışma sonrası tüm kullanılabilir RAM'i kaybetti. Tanılama döngüleri ortaya çıkardı ve her rapordan sonra Scalar::Util kullandı.