Grundlagen
- Besteht aus zwei Komponenten
- Reference Counting Collector
- Generational Garbage Collector
Reference Counting (RC)
Das Rference Counting ist fundamental und nicht deaktivierbar
Jede Variable in Python ist eine Referenzierung (Pointer) auf ein Objekt.
Jedes Objekt hat einen Referenzzahl, die durch neue oder wegfallende Pointer aktualisiert wird.
Fällt die Referenzzahl auf 0, wird automatisch die Freigabe des vom Objekt belegten Speichers eingeleitet.
Globale Variablen verhindern diesen Vorgang.
Referenzierungen auf lokale Variablen werden hingegen vom Interpreter nach verlassen eines Code-Blocks aufgelöst.
Beispiel:
a = 37 # Creates an object with value 37
b = a # Increases reference count on 37
c = []
c.append(b) # Increases reference count on 37
del a # Decrease reference count of 37
b = 42 # Decrease reference count of 37
c[0] = 2.0 # Decrease reference count of 37
Generational Garbage Collector (GGC)
Der GGC
ist optional und kann manuell deaktiviert werden
Wozu den GGC?:
Das Reference Counting
versagt, wenn ein oder mehrere Objekte sich gegenseitig referenzieren (Reference Cycle
). Hier kann die Referenzzahl nicht unter 1 fallen.
Beispiel:
a = { }
b = { }
a['b'] = b # a contains reference to b
b['a'] = a # b contains reference to a
del a
del b
Obwohl mit del
die "Namen" gelöscht werden, die auf das zugrunde liegende Objekt referenzieren, bleibt die Referenzierung zwischen den Objekten erhalten. Ohne GGC
entstünde hier ein Speicherleck
Generelle Infos zum GGC
:
- Der
GGC
wird periodisch ausgeführt und nicht wie dasRC
in Echtzeit. - Der
GGC
klassifiziert Objekte in 3 Generationen/Stufen - "Überlebt" ein Objekt eine GGC-Runde, kommt es in eine höhere Stufe
- Der
GGC
arbeitet nach dem Motto: "Most newly created Objects die young" heißt, er arbeitet niedrige Stufen öfter ab als hohe. - Der Laufzeitpunkt des
GGC
bestimmt sich per Stufe an einem Zähler - Dieser Zähler bestimmt die Differenz aus neuen Objekten und freigegeben Objekten für jede Stufe
Die Erkennung für freizugebende Objekte ist ein komplexer Prozess, vereinfacht lässt sich sagen, dass der GGC
temporär alle problematischen Referenzen aufhebt und anschließent alle Objekte mit einer Referenzzahl von kleiner 2 freigibt.
Um die allgemeine Preformance zu verbessern, gilt es somit Reference Cycles zu vermeiden, um GGC
-Durchläufe zu verhindern.