logo

Garbage Collection in Python

Müllabfuhr In Python ist ein automatischer Prozess, der die Speicherzuweisung und -freigabe übernimmt und so eine effiziente Speichernutzung gewährleistet. Im Gegensatz zu Sprachen wie C oder C++ wobei der Programmierer Speicher manuell zuweisen und freigeben muss. Python verwaltet den Speicher automatisch mithilfe von zwei Hauptstrategien:

  1. Referenzzählung
  2. Müllabfuhr

Referenzzählung

Python verwendet Referenzzählung um den Speicher zu verwalten. Jedes Objekt verfolgt, wie viele Referenzen darauf verweisen. Wenn der Referenzzähler auf Null fällt, also keine Referenzen mehr vorhanden sind, gibt Python das Objekt automatisch frei. Beispiel:

Python
import sys x = [1 2 3] print(sys.getrefcount(x)) y = x print(sys.getrefcount(x)) y = None print(sys.getrefcount(x)) 

Ausgabe
2 3 2 

Erläuterung:



  • X wird anfänglich zweimal referenziert (einmal von x, einmal von getrefcount()).
  • Zuweisen y = x erhöht die Anzahl.
  • Einstellung y = Keine Entfernt eine Referenz.

Problem mit der Referenzzählung

Die Referenzzählung schlägt fehl, wenn zyklische Referenzen vorhanden sind, d. h. Objekte, die in einem Zyklus aufeinander verweisen. Auch wenn nichts anderes auf sie hinweist, erreicht ihr Referenzzähler nie Null. Beispiel:

Python
import sys x = [1 2 3] y = [4 5 6] x.append(y) y.append(x) print(sys.getrefcount(x)) print(sys.getrefcount(y)) 

Ausgabe
3 3 

Erläuterung:

  • X enthält Und Und Und enthält X .
  • Auch nach dem Löschen X Und Und Python kann den Speicher nicht allein mithilfe der Referenzzählung freigeben, da beide weiterhin auf die anderen verweisen.

Garbage Collection für zyklische Referenzen

Müllabfuhr ist eine Speicherverwaltungstechnik, die in Programmiersprachen verwendet wird, um automatisch Speicher zurückzugewinnen, auf den nicht mehr zugegriffen werden kann oder der von der Anwendung nicht mehr verwendet wird. Um solche Zirkelverweise zu verarbeiten, verwendet Python a Müllsammler (GC) aus dem integrierten GC-Modul. Dieser Kollektor ist in der Lage, an Referenzzyklen beteiligte Objekte zu erkennen und zu bereinigen.

Generationsübergreifende Müllabfuhr

Der Generational Garbage Collector von Python ist für den Umgang mit zyklischen Referenzen konzipiert. Es organisiert Objekte basierend auf ihrer Lebensdauer in drei Generationen:

  • Generation 0: Neu erstellte Objekte.
  • Generation 1: Objekte, die einen Sammlungszyklus überlebt haben.
  • Generation 2: Langlebige Objekte.

Wenn Referenzzyklen auftreten, erkennt der Garbage Collector diese automatisch und bereinigt sie, wodurch der Speicher freigegeben wird.

Automatische Garbage Collection von Zyklen

Die Garbage Collection wird automatisch ausgeführt, wenn die Anzahl der Zuweisungen die Anzahl der Freigaben um einen bestimmten Schwellenwert überschreitet. Dieser Schwellenwert kann mit dem GC-Modul überprüft werden.

Python
import gc print(gc.get_threshold()) 

Ausgabe
(2000 10 10) 

Erläuterung: Es gibt das Schwellenwert-Tupel für die Generationen 0, 1 und 2 zurück. Wenn Zuweisungen den Schwellenwert überschreiten, wird eine Sammlung ausgelöst.

Manuelle Müllabfuhr

Manchmal ist es von Vorteil, den Garbage Collector manuell aufzurufen, insbesondere im Fall von Referenzzyklen. Beispiel:

Python
import gc # Create a cycle def fun(i): x = {} x[i + 1] = x return x # Trigger garbage collection c = gc.collect() print(c) for i in range(10): fun(i) c = gc.collect() print(c) 

Ausgabe
0 10 

Erläuterung:

  • Auf jeden Fall lustig(i) erstellt eine zyklische Referenz, indem es selbst eine Wörterbuchreferenz erstellt.
  • gc.collect() Löst die Speicherbereinigung aus und speichert die Anzahl der gesammelten Objekte (ursprünglich 0).
  • für i im Bereich(10) Anrufe Spaß(i) 10 Mal, wodurch 10 zyklische Referenzen erstellt werden.
  • gc.collect() Löst die Speicherbereinigung erneut aus und gibt die Anzahl der gesammelten Zyklen aus.

Arten der manuellen Garbage Collection

  • Zeitbasierte Speicherbereinigung: Der Garbage Collector wird in festen Zeitintervallen ausgelöst.
  • Ereignisbasierte Speicherbereinigung: Der Garbage Collector wird als Reaktion auf bestimmte Ereignisse aufgerufen, beispielsweise wenn ein Benutzer die Anwendung verlässt oder wenn die Anwendung inaktiv wird.

Erzwungene Müllabfuhr

Der Garbage Collector (GC) von Python wird automatisch ausgeführt, um nicht verwendete Objekte zu bereinigen. Um es manuell zu erzwingen, verwenden Sie gc.collect() aus dem gc-Modul. Beispiel:

Python
import gc a = [1 2 3] b = {'a': 1 'b': 2} c = 'Hello world!' del abc gc.collect() 

Erläuterung:

  • aus dem a b c löscht Verweise auf ein b Und C Dadurch sind sie für die Müllabfuhr geeignet.
  • gc.collect() Erzwingt die Garbage Collection, um Speicher freizugeben, indem nicht referenzierte Objekte bereinigt werden.

Garbage Collection deaktivieren

In Python wird der Garbage Collector automatisch ausgeführt, um nicht referenzierte Objekte zu bereinigen. Um die Ausführung zu verhindern, können Sie es mit gc.disable() aus dem gc-Modul deaktivieren. Beispiel:

Python
import gc gc.disable() gc.enable() 

Erläuterung:

  • gc.disable() deaktiviert die automatische Speicherbereinigung.
  • gc.enable() Aktiviert die automatische Speicherbereinigung wieder.

Interaktion mit dem Python-Garbage Collector

Ein integrierter Mechanismus namens Python Garbage Collector entfernt automatisch Objekte, auf die nicht mehr verwiesen wird, um Speicher freizugeben und Speicherlecks zu stoppen. Das Python-GC-Modul bietet eine Reihe von Möglichkeiten zur Interaktion mit dem Garbage Collector, der häufig automatisch ausgeführt wird.

1. Aktivieren und Deaktivieren des Garbage Collectors: Sie können den Garbage Collector mit aktivieren oder deaktivieren gc. aktivieren() Und gc. deaktivieren() Funktionen bzw. Beispiel :

vergleiche mit Strings in Java
Python
import gc # Disable  gc.disable() # Enable gc.enable() 

2. Garbage Collection erzwingen: Sie können eine Garbage Collection mithilfe von manuell auslösen gc. sammeln() Funktion. Dies kann in Fällen nützlich sein, in denen Sie eine sofortige Garbage Collection erzwingen möchten, anstatt auf die automatische Garbage Collection zu warten.  Beispiel:

Python
import gc gc.collect() 

3. Überprüfen der Garbage-Collector-Einstellungen: Sie können die aktuellen Einstellungen des Garbage Collectors mit überprüfen gc.get_threshold() Funktion, die ein Tupel zurückgibt, das die aktuellen Schwellenwerte für die Generationen 0, 1 und 2 darstellt.  Beispiel:

Python
import gc t = gc.get_threshold() print(t) 

Ausgabe
(2000 10 10) 

4. Garbage-Collector-Schwellenwerte festlegen: Sie können die Schwellenwerte für die Garbage Collection mithilfe von festlegen gc.set_threshold() Funktion. Dadurch können Sie die Schwellenwerte für verschiedene Generationen manuell anpassen, was sich auf die Häufigkeit der Speicherbereinigung auswirken kann.  Beispiel:

Python
import gc gc.set_threshold(500 5 5) t = gc.get_threshold() print(t) 

Ausgabe
(500 5 5) 

Vor- und Nachteile 

Lassen Sie uns einige der Vor- und Nachteile der Garbage Collection von Python untersuchen.

Vorteile

Nachteile

Automatische Speicherverwaltung

Kann zu Leistungseinbußen führen

Keine manuelle Speicherverwaltung

Erfordert Verständnis von Gedächtniskonzepten

Effiziente Bereinigung über Generationen hinweg

Begrenzte Kontrolle über das Timing von GC

Anpassbare GC-Einstellungen

Möglichkeit von Fehlern oder Speicherlecks

Quiz erstellen