Python bellek yönetimini nasıl yapar? Reference counting ve garbage collector birlikte nasıl çalışır?
Cevap
CPython iki mekanizma kullanır: reference counting (ana mekanizma) ve döngüsel referansları temizleyen generational cyclic garbage collector (gc modülü).
Reference counting
Her nesnenin bir referans sayacı vardır. Bir isme atandığında, listeye eklendiğinde artar; isim silindiğinde veya kapsam dışına çıktığında azalır. Sayaç 0 olduğu anda nesne hemen serbest bırakılır.
import sys
a = []
b = a
sys.getrefcount(a) # 3 (a, b ve getrefcount'un kendi argümanı; kesin sayı sürüme göre değişebilir)
del bAvantajı: belleğin deterministik ve hemen geri verilmesi (dosyalar çoğu zaman close unutulsa da kapanır, ama buna güvenmeyin; with kullanın).
Döngüsel referanslar
class Node:
def __init__(self):
self.other = None
x, y = Node(), Node()
x.other, y.other = y, x
del x, y # sayaçlar 0'a inmez: birbirlerini gösteriyorlarBunları cyclic GC bulur. Nesneler generation'lara ayrılır; genç nesil sık, yaşlı nesil seyrek taranır. gc.collect() elle tetikler, gc.get_threshold() eşikleri gösterir. Python 3.14.0 ile gelen artımlı (incremental) GC, production'da bellek baskısı yarattığı için 3.14.5'te (Mayıs 2026) geri alındı; 3.14 ve 3.15 yine klasik generational collector'ı kullanır.
Pratik bilgiler
- Küçük nesneler için CPython kendi allocator'ını (pymalloc) kullanır; serbest kalan bellek her zaman işletim sistemine geri verilmez. Bu yüzden uzun çalışan bir worker'ın RSS'i "düşmüyor" görünebilir.
- Sızıntı arama:
tracemallocile snapshot farkı alın; tipik suçlular büyüyen global cache'ler, modül seviyesinde listeler, kapanmayan bağlantılardır. weakrefile cache'te referans sayısını artırmadan nesne tutabilirsiniz.__slots__tanımlamak, milyonlarca küçük nesnede instance başına__dict__maliyetini kaldırır.
İlgili Python soruları
- list ve tuple arasındaki fark nedir?
- Varsayılan argüman olarak liste vermek neden tehlikelidir?
- Decorator nedir? Basit bir zamanlama decorator'ı yazın.
- Generator nedir, yield ne yapar?
- GIL nedir ve çoklu iş parçacığını nasıl etkiler?
- async/await ve asyncio nasıl çalışır? Ne zaman thread veya process yerine tercih edilir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.