Grundlagen
- Besteht aus zwei Komponenten
- Reference Counting Collector
- Generational Garbage Collector
Reference Counting (RC)
Das Reference 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:
|
|
|
|
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:
|
|
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 das RC 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.