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:
- Referenzzählung
- 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:
Pythonimport 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:
Pythonimport 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.
Pythonimport 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:
Pythonimport 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:
Pythonimport 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:
Pythonimport 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 JavaPython
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:
Pythonimport 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:
Pythonimport 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:
Pythonimport 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 |