0Pricing
Python Academy · Lektion

Der Garbage Collector und zyklische Referenzen

Lernen Sie, wie das gc-Modul Referenzzyklen verarbeitet.

Der Garbage Collector und zyklische Referenzen ist eine kostenlose Python Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Python Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum Referenzzählung nicht ausreicht

Die Referenzzählung kann keine Objekte freigeben, die an Referenzzyklen beteiligt sind – jedes hält eine Referenz auf das andere, sodass keiner der beiden Zähler auf 0 sinkt.

# Reference cycle: a → b → a
a = {}
b = {"other": a}
a["other"] = b
del a, b
# Both objects are unreachable but refcount > 0
# Only the cyclic GC can collect them

Das gc-Modul

gc ist der zyklische Garbage Collector. Er durchsucht regelmäßig überwachte Objekte nach nicht erreichbaren Zyklen und gibt diese frei.

import gc

gc.collect()   # trigger immediately
print(gc.garbage)   # objects with __del__ in cycles (cannot auto-collect)

Generationenbasierte Sammlung

Der GC verwendet drei Generationen. Neue Objekte beginnen in Generation 0. Objekte, die eine Sammlung überleben, werden in eine höhere Generation verschoben. Generation 0 wird am häufigsten gesammelt.

import gc

print(gc.get_count())     # (gen0, gen1, gen2) allocations since last collection
print(gc.get_threshold()) # (700, 10, 10) — thresholds for each generation
gc.set_threshold(1000, 15, 10)  # tune

Zyklen mit gc.get_referents erkennen

Untersuchen Sie, auf welche Objekte ein Objekt verweist – dies ist nützlich, um zu verstehen, warum etwas nicht freigegeben wird.

import gc

a = []
b = [a]
a.append(b)

for ref in gc.get_referents(a):
    print(ref)   # shows b

gc.get_objects()

gc.get_objects() gibt alle Objekte zurück, die derzeit vom GC überwacht werden. Dies ist nützlich, um Speicherlecks zu finden.

import gc

before = len(gc.get_objects())
create_lots_of_objects()
after = len(gc.get_objects())
print(f"Leaked: {after - before} objects")

Zyklen vermeiden

Entwerfen Sie Datenstrukturen so, dass sie Zyklen vermeiden: Verwenden Sie weakrefs für Rückreferenzen, IDs statt direkter Referenzen oder lösen Sie Zyklen explizit auf, bevor Objekte den Gültigkeitsbereich verlassen.

import weakref

class Node:
    def __init__(self, parent):
        # weakref avoids cycle:
        self.parent = weakref.ref(parent)

class Tree:
    def __init__(self):
        self.child = Node(self)   # no hard cycle

__del__ und Zyklen

Objekte mit __del__, die an einem Zyklus beteiligt sind, können nicht automatisch freigegeben werden. Stattdessen werden sie in gc.garbage abgelegt.

import gc

class Leaky:
    def __del__(self): pass

a = Leaky()
b = Leaky()
a.other = b
b.other = a
del a, b

gc.collect()
print(gc.garbage)   # [Leaky, Leaky] — cannot collect

gc.freeze() – Python 3.7+

gc.freeze() friert aktuell überwachte Objekte ein, sodass sie niemals freigegeben werden. Dies ist nach dem Start in langlebigen Prozessen nützlich, um GC-Pausen zu reduzieren.

import gc

# After all globals and imports are in place:
gc.freeze()   # no GC scanning for these objects ever again

# Useful for: gunicorn pre-fork, background servers

GC deaktivieren und wieder aktivieren

Deaktivieren Sie den zyklischen GC in engen Schleifen, wenn Sie wissen, dass keine Zyklen existieren, und aktivieren Sie ihn anschließend wieder, um danach eine Sammlung zu erzwingen.

import gc

gc.disable()
try:
    result = tight_loop_no_cycles()
finally:
    gc.enable()
    gc.collect()

isenabled und isfinalized

Prüfen Sie den GC-Status mit gc.isenabled() und erkennen Sie mit gc.is_finalized(obj), ob ein Objekt finalisiert wird.

import gc

print(gc.isenabled())      # True by default
obj = object()
print(gc.is_finalized(obj))  # False (still alive)

Typische Muster bei Speicherlecks

Häufige Ursachen für Speicherlecks in Python sind unbegrenzt wachsende globale Caches, nicht entfernte Event-Listener, zyklische Referenzen mit __del__ und C-Erweiterungen, die Referenzen nicht freigeben.

# Typical leaks:
global_cache = {}   # grows forever — use lru_cache with maxsize

class EventBus:
    listeners = []
    # Listeners hold references to objects:
    # @classmethod
    # def on(cls, fn): cls.listeners.append(fn)
    # Must call off() to detach

Schnelltest

Was geschieht mit Objekten mit __del__, die an einem Referenzzyklus beteiligt sind?

Zusammenfassung

Der zyklische GC verarbeitet Referenzzyklen, die die Referenzzählung nicht freigeben kann. Er verwendet drei Generationen und verschiebt überlebende Objekte in höhere Generationen. Vermeiden Sie Zyklen mit weakrefs. Objekte mit __del__ in Zyklen landen in gc.garbage. Verwenden Sie gc.freeze() nach dem Start, um GC-Pausen in langlebigen Servern zu reduzieren.

Häufig gestellte Fragen

Ist die Lektion „Der Garbage Collector und zyklische Referenzen“ kostenlos?

Ja — der vollständige Text von „Der Garbage Collector und zyklische Referenzen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Python Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Der Garbage Collector und zyklische Referenzen“?

Lernen Sie, wie das gc-Modul Referenzzyklen verarbeitet. Du übst Python Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Python Academy zu starten?

Keine Vorkenntnisse erforderlich. Python Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Der Garbage Collector und zyklische Referenzen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Python Academy-Lektion Code schreiben und ausführen?

Ja. Jede Python Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Referenzzählung in CPython
  2. Der Garbage Collector und zyklische Referenzen
  3. Profiling mit cProfile und line_profiler
  4. Speicherprofiling mit tracemalloc
← Zurück zu Python Academy