ProgramlamaBackend geliştirici

Python'da bellek yönetiminin nasıl çalıştığını açıklayın, çöp toplayıcı da dahil. Döngüsel referanslar nedir ve Python bunlarla nasıl başa çıkıyor?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Python'da bellek otomatik olarak yönetilir: bir nesne oluşturulduğunda bellek ayrılır ve başka hiçbir nesne artık o nesneye atıfta bulunmadığında bellek serbest bırakılır. Temel strateji referans sayısıdır: her nesneye bağlı bir referans sayacı vardır; bu sayacı sıfıra düştüğünde - nesne silinir.

Ancak, döngüsel referanslar mümkündür, bu durumlarda nesneler birbirine atıfta bulunur ve referans sayısı asla sıfıra inmez, dış koddan referanslar silinmiş olsa bile.

Bununla başa çıkmak için Python'da (CPython) çöp toplayıcı (garbage collector, GC) vardır; bu, köklerden erişilemeyen nesne döngülerini tespit eder ve bunları siler. Çöp toplayıcı gc modülü üzerinden yönetilebilir.

Döngü örneği:

class Node: def __init__(self): self.ref = None n1 = Node() n2 = Node() n1.ref = n2 n2.ref = n1 del n1, n2 # nesneler hala hayatta, döngüsel referanstan dolayı!

Aşırı Dikkat Edilmesi Gereken Soru

Soru: "del obj çağrılırsa, bellek her zaman hemen serbest bırakılır mı?"

Cevap: Hayır! del işlemi sadece bir nesneye olan bir referansı kaldırır. Eğer başka (açık veya döngüsel) referanslar varsa — bellek, referans sayısı sıfıra ulaşana kadar ve/veya GC döngüleri temizlemediği sürece serbest bırakılmaz. Örnek:

import gc class A: pass x = A() y = x del x # y'de hala bir referans var, nesne hayatta! del y # ancak şimdi nesne silinebilir

Konuyla ilgili ince detayları bilmemekten kaynaklanan gerçek hata örnekleri


Hikaye

Büyük dosya işleme sisteminde, bellek içinde ilişkilendirilmiş nesneler tutuluyordu. Dış referanslar silindikten sonra bellek hala serbest bırakılmadı. Sebep — döngüsel referanslar, bu referanslar hemen temizlenmedi ve bazen __del__ yapıcısının varlığından dolayı hiç temizlenmedi.


Hikaye

Uzun ömürlü bir sunucu sürecinde sık sık döngüsel grafikleri olan büyük geçici yapılar oluşturuldu. Geliştiriciler GC'nin geçici hata ayıklama çıktısını kapatmadılar, bu da arka planda nadir fakat hissedilir duraklamalara yol açtı. "Performans düşüşleri" olarak teşhis edildi. Sonuçta, suçlu sık sık çöp toplayıcının devreye girmesiydi.


Hikaye

Büyük bir projeyi PyPy'ye (alternatif bir yorumlayıcı) taşırken eski kod, referans sayısı yoluyla bellek temizleme konusunda CPython'a bağımlıydı — PyPy'de nesneler hemen silinmedi ve temizlenmedi, ancak GC'nin "isteğine" bağlı olarak, bu da açık dosyalar ve ağ bağlantılarıyla öngörülemeyen bir davranışa yol açtı.