Python Garbage Collection: Alles, was Sie wissen müssen
Jan 17, 2025
# python
Emily Parker
Product Engineer · Leapcell

I. Überblick über die Speicherbereinigung
- In der Informatik ist Garbage Collection (abgekürzt GC) ein automatischer Mechanismus zur Speicherverwaltung. Wenn auf bestimmten Speicherplatz, der von einem Programm belegt wird, nicht mehr zugegriffen wird, gibt das Programm ihn mithilfe von Garbage-Collection-Algorithmen an das Betriebssystem zurück.
- Der Garbage Collector kann die Belastung für Programmierer reduzieren und Programmfehler minimieren. Er stammt aus der LISP-Sprache.
- Derzeit unterstützen viele Sprachen wie Smalltalk, Java, C#, Go und D Garbage Collectors.
- Als automatischer Mechanismus zur Speicherverwaltung moderner Programmiersprachen führt GC hauptsächlich zwei Aufgaben aus:
- Identifizierung nutzloser Garbage-Ressourcen im Speicher.
- Bereinigung dieser Garbage-Daten und Freigabe des Speichers für andere Objekte zur Nutzung.
- Er befreit Programmierer von der hohen Last der Ressourcenverwaltung und ermöglicht es ihnen, sich stärker auf die Geschäftslogik zu konzentrieren. Programmierer müssen GC jedoch weiterhin verstehen, was ihnen hilft, robusteren Code zu schreiben.
II. Gängige Algorithmen zur Speicherbereinigung
- Referenzzählung:
- Führen Sie eine Referenzzählung für jedes Objekt. Wenn das Objekt, das auf dieses Objekt verweist, zerstört wird, wird die Referenzzählung um eins verringert. Wenn die Referenzzählung des Objekts Null erreicht, wird das Objekt recycelt.
- Repräsentative Sprachen: Python, PHP, Swift.
- Vorteile: Schnelles Objekt-Recycling und es wird nicht erst recycelt, wenn der Speicher erschöpft ist oder wenn ein bestimmter Schwellenwert erreicht ist.
- Nachteile: Es kann zirkuläre Referenzen nicht effektiv verarbeiten und die Echtzeit-Wartung der Referenzzählung verursacht Overhead.
- Mark-Sweep:
- Durchlaufen Sie alle referenzierten Objekte, beginnend mit der Root-Variablen, markieren Sie die referenzierten Objekte und recyceln Sie diejenigen, die nicht markiert sind.
- Repräsentative Sprachen: Golang (Tri-Color-Markierungsmethode), Python (Hilfsfunktion).
- Vorteile: Es überwindet die Nachteile der Referenzzählung.
- Nachteile: Es erfordert STW (vorübergehendes Anhalten der Programmausführung).
- Generationen-Sammlung:
- Teilen Sie verschiedene Generationenbereiche entsprechend der Lebensdauer des Objekts auf. Objekte mit langer Lebensdauer werden in der alten Generation platziert, und Objekte mit kurzer Lebensdauer werden in der neuen Generation platziert. Verschiedene Generationen haben unterschiedliche Recyclingalgorithmen und -frequenzen.
- Repräsentative Sprachen: Java, Python (Hilfsfunktion).
- Vorteile: Gute Recycling-Leistung.
- Nachteile: Der Algorithmus ist komplex.
III. Der Garbage-Collection-Mechanismus von Python
- Beschreibung aus der offiziellen Dokumentation:
- Die Details der Speicherverwaltung von Python hängen von der Implementierung ab.
- CPython verwendet Referenzzählung, um unzugängliche Objekte zu erkennen, und verwendet einen anderen Mechanismus, um Referenzzyklen zu sammeln. Es führt regelmäßig einen Zykluserkennungsalgorithmus aus, um unzugängliche Zyklen zu finden und die beteiligten Objekte zu löschen.
- Das Modul gc bietet Funktionen zum Durchführen der Speicherbereinigung, zum Abrufen von Debugging-Statistiken und zum Optimieren von Collector-Parametern.
- Andere Implementierungen (wie Jython oder PyPy) können sich auf andere Mechanismen verlassen, wie z. B. einen vollständigen Garbage Collector. Wenn Python-Code vom durch Referenzzählung implementierten Verhalten abhängt, kann dies zu Portabilitätsproblemen führen.
- Referenzzählung:
- Der von Python standardmäßig verwendete Garbage-Collection-Mechanismus ist die Referenzzählungsmethode, die erstmals 1960 von George E. Collins vorgeschlagen wurde und noch heute von vielen Programmiersprachen verwendet wird.
- Prinzip: Jedes Objekt verwaltet ein ob_ref-Feld, das die Anzahl der Male aufzeichnet, wie oft auf das Objekt verwiesen wird. Wenn eine neue Referenz auf das Objekt verweist, wird ob_ref um eins erhöht. Wenn die Referenz ungültig wird, wird ob_ref um eins verringert. Wenn die Referenzzählung Null ist, wird das Objekt sofort recycelt und der belegte Speicherplatz freigegeben.
- Nachteile: Es ist zusätzlicher Speicher erforderlich, um die Referenzzählung zu verwalten, und es kann die „zirkuläre Referenz" von Objekten nicht lösen. Zum Beispiel:
a = {} # Die Referenzzählung von Objekt A ist 1 b = {} # Die Referenzzählung von Objekt B ist 1 a['b'] = b # Die Referenzzählung von B wird um 1 erhöht b['a'] = a # Die Referenzzählung von A wird um 1 erhöht del a # Die Referenz von A wird um 1 verringert, und die endgültige Referenz von Objekt A ist 1 del b # Die Referenz von B wird um 1 verringert, und die endgültige Referenz von Objekt B ist 1
- Im obigen Beispiel bilden die Objekte A und B nach Ausführung der del-Anweisungen eine zirkuläre Referenz. Obwohl es keine externen Referenzen gibt, ist die Referenzzählung nicht Null, sodass sie nicht recycelt werden, was zu einem Speicherleck führen kann.
- Mark-Sweep:
- Es ist ein Garbage-Collection-Algorithmus, der auf der Tracing-GC-Technologie basiert und aus zwei Phasen besteht:
- Markierungsphase: Markieren Sie alle „aktiven Objekte".
- Sweeping-Phase: Recyceln Sie alle „inaktiven Objekte", die nicht markiert sind.
- Ausgehend von Root-Objekten (wie globalen Variablen, dem Aufrufstapel und Registern) durchlaufen Sie Objekte entlang gerichteter Kanten. Erreichbare Objekte werden als aktive Objekte markiert, und nicht erreichbare Objekte werden als inaktive Objekte markiert und dann gelöscht.
- Der Mark-Sweep-Algorithmus behandelt als Hilfs-Garbage-Collection-Technologie von Python hauptsächlich Containerobjekte (wie Liste, Dict, Tupel, Instanz usw.), da Zeichenfolgen- und numerische Objekte keine Probleme mit zirkulären Referenzen verursachen.
- Python verwendet eine doppelt verkettete Liste, um diese Containerobjekte zu organisieren.
- Nachteile: Es ist erforderlich, den gesamten Heap-Speicher sequenziell zu scannen, bevor inaktive Objekte gelöscht werden. Selbst wenn nur ein kleiner Teil aktiver Objekte verbleibt, müssen alle Objekte gescannt werden.
- Es ist ein Garbage-Collection-Algorithmus, der auf der Tracing-GC-Technologie basiert und aus zwei Phasen besteht:
- Generationen-Recycling:
- Es ist ein Betriebsmodus, der Platz gegen Zeit tauscht. Der Speicher wird je nach Überlebenszeit des Objekts in verschiedene Sätze unterteilt, und jeder Satz wird als Generation betrachtet. Python ist in drei Generationen unterteilt: die junge Generation (Generation 0), die mittlere Generation (Generation 1) und die alte Generation (Generation 2), die drei verketteten Listen entsprechen. Die Garbage-Collection-Frequenz nimmt mit zunehmender Überlebenszeit des Objekts ab.
- Neu erstellte Objekte werden der jungen Generation zugewiesen. Wenn die Gesamtzahl der verketteten Liste der jungen Generation die Obergrenze erreicht, wird der Garbage-Collection-Mechanismus ausgelöst. Recycelbare Objekte werden recycelt, und nicht recycelbare Objekte werden in die mittlere Generation verschoben usw. Objekte in der alten Generation überleben am längsten.
- Das Generationen-Recycling basiert auf der Mark-Sweep-Technologie und dient auch als Hilfs-Garbage-Collection-Technologie in Python zur Behandlung von Containerobjekten.
IV. Speicherleck
- Speicherlecks sind in der täglichen Python-Nutzung relativ selten.
- Situationen, in denen CPython beim Beenden nicht den gesamten Speicher freigibt:
- Objekte, auf die vom globalen Namespace oder von Python-Modulen verwiesen wird, werden nicht immer freigegeben, was auftreten kann, wenn eine zirkuläre Referenz vorhanden ist. Ein Teil des von C-Bibliotheken zugewiesenen Speichers wird möglicherweise auch nicht freigegeben.
- Python bereinigt den Speicher und versucht, jedes Objekt beim Beenden zu zerstören.
- Wenn Sie Python zwingen möchten, bestimmte Inhalte beim Freigeben zu löschen, können Sie das Modul atexit verwenden, um eine Funktion auszuführen.
- Codebeispiel:
# In einigen Python-Implementierungen kann der folgende Code (der in CPython gut funktioniert) Dateideskriptoren erschöpfen for file in very_long_list_of_files: f = open(file) c = f.read(1)
- Verbesserte Lösung:
# Sie sollten die Datei explizit schließen oder die with-Anweisung verwenden, die unabhängig vom Speichermanagementschema wirksam ist for file in very_long_list_of_files: with open(file) as f: c = f.read(1)
Leapcell: Die beste Serverless-Plattform für das Python App Hosting
Lassen Sie mich abschließend die am besten geeignete Plattform für die Bereitstellung von Python-Diensten vorstellen: Leapcell
1. Mehrsprachige Unterstützung
- Entwickeln Sie mit JavaScript, Python, Go oder Rust.
2. Stellen Sie unbegrenzt Projekte kostenlos bereit
- Zahlen Sie nur für die tatsächliche Nutzung – keine Gebühren ohne Anfragen.
3. Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: Mit 25 $ können Sie 6,94 Millionen Anfragen mit einer durchschnittlichen Antwortzeit von 60 Millisekunden unterstützen.
4. Optimierte Entwicklererfahrung
- Intuitive Benutzeroberfläche für einfache Einrichtung.
- Vollautomatische CI/CD-Pipelines und GitOps-Integration.
- Echtzeitmetriken und -protokollierung für verwertbare Einblicke.
5. Mühelose Skalierbarkeit und hohe Leistung
- Auto-Skalierung zur einfachen Bewältigung hoher Parallelität.
- Null Betriebsaufwand – konzentrieren Sie sich einfach auf das Erstellen.
Erfahren Sie mehr in der Dokumentation!
Leapcell Twitter: https://x.com/LeapcellHQ