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 b

Avantajı: 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österiyorlar

Bunları 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: tracemalloc ile snapshot farkı alın; tipik suçlular büyüyen global cache'ler, modül seviyesinde listeler, kapanmayan bağlantılardır.
  • weakref ile 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.
  1. list ve tuple arasındaki fark nedir?KolayPythonBackend
  2. Varsayılan argüman olarak liste vermek neden tehlikelidir?OrtaPythonBackend
  3. Decorator nedir? Basit bir zamanlama decorator'ı yazın.OrtaPythonBackend
  4. Generator nedir, yield ne yapar?OrtaPythonBackend
  5. GIL nedir ve çoklu iş parçacığını nasıl etkiler?ZorPythonBackend
  6. async/await ve asyncio nasıl çalışır? Ne zaman thread veya process yerine tercih edilir?ZorPythonBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle