Featured image of post Garbage Collection in Python

Garbage Collection in Python

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:

1
2
3
4
a = 37       # Creates an object with value 37
b = a        # Increases reference count on 37
c = []
c.append(b)  # Increases reference count on 37
1
2
3
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:

1
2
3
4
5
6
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 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.


Licensed under CC BY-NC-SA 4.0