Heim > Artikel > Backend-Entwicklung > Detaillierte Erläuterung des Python-Garbage-Collection-Mechanismus
Referenzzählung
Pythons Standard-Garbage-Collection-Mechanismus ist „Referenzzählung“, und jedes Objekt verwaltet ein ob_ref-Feld. Sein Vorteil besteht darin, dass sein Mechanismus einfach ist. Wenn eine neue Referenz auf das Objekt zeigt, wird der Referenzzähler um 1 erhöht. Wenn die Referenz eines Objekts zerstört wird, wird er um 1 verringert. Sobald der Referenzzähler des Objekts 0 ist , wird das Objekt sofort recycelt und der belegte Speicher wird freigegeben. Der Nachteil besteht darin, dass zusätzlicher Platz zum Verwalten der Referenzanzahl benötigt wird. Das Hauptproblem besteht jedoch darin, dass „zyklische Referenzen“ nicht gelöst werden können.
Was ist ein Zirkelverweis? A und B verweisen aufeinander und es gibt keine externe Referenz auf A oder B. Obwohl ihre Referenzanzahlen beide 1 sind, sollten sie offensichtlich recycelt werden. Beispiel:
a = { } # Die Referenz von a ist 1
b = { } # Die Referenz von b ist 1
a['b'] = b # Die Referenz von b wird um 1 erhöht, die Referenz von b ist 2
b['a'] = a # Die Referenz von a ist um 1 erhöht, die Referenz von a ist 2
del a # Die Referenz von a ist minus 1, die Referenz von a ist 1
del b # Die Referenz von b ist minus 1, die Referenz von b ist 1
In diesem Beispiel reduziert die del-Anweisung die Referenzanzahl von a und b und löscht den als Referenz verwendeten Variablennamen, da die beiden Objekte jedoch jeweils eine Referenz auf das andere Objekt enthalten Obwohl auf die letzten beiden Objekte nicht über den Namen zugegriffen werden kann, wird der Referenzzähler nicht auf Null reduziert. Daher wird dieses Objekt nicht zerstört, sondern bleibt immer im Speicher, was zu einem Speicherverlust führt. Um das Problem der Zirkelverweise zu lösen, führte Python zwei GC-Mechanismen ein: Mark-Sweep und Generational Collection.
Mark Sweep
Mark-Sweep ist ein Garbage-Collection-Algorithmus, der auf der Tracing-Recycling-Technologie basiert. Objekte werden durch Referenzen (Zeiger) verbunden, um einen gerichteten Graphen zu bilden. Objekte bilden die Knoten dieses gerichteten Graphen und eine Referenz Beziehungen bilden die Kanten dieses gerichteten Graphen. Ausgehend vom Stammobjekt werden Objekte entlang gerichteter Kanten durchlaufen. Erreichbare Objekte werden als nützliche Objekte markiert, und nicht erreichbare Objekte sind zu löschende Objekte. Die sogenannten Root-Objekte sind einige globale Referenzobjekte und Referenzen im Funktionsstapel. Die durch diese Referenzen referenzierten Objekte können nicht gelöscht werden.
Als Pythons zusätzliche Garbage-Collection-Technologie befasst sich der Markierungslöschalgorithmus hauptsächlich mit einigen Containerobjekten wie Listen, Diktaten, Tupeln, Instanzen usw., da es unmöglich ist, Zirkelverweise für Zeichenfolgen zu verursachen und numerische Objekte Frage. Python verwendet eine doppelt verknüpfte Liste, um diese Containerobjekte zu organisieren.
Generationsrecycling
Generationsrecycling ist eine Operationsmethode, bei der Python den Speicher basierend auf der Überlebenszeit des Objekts in verschiedene Sammlungen aufteilt unterteilt in 3 „Generationen“, nämlich die junge Generation (0. Generation), die mittlere Generation (1. Generation) und die alte Generation (2. Generation). Sie entsprechen 3 verknüpften Listen und ihre Speicherbereinigungshäufigkeit hängt mit der des Objekts zusammen Nimmt mit zunehmender Überlebenszeit ab. Neu erstellte Objekte werden in der jungen Generation zugewiesen. Wenn die Gesamtzahl der verknüpften Listen der jungen Generation die Obergrenze erreicht, wird der Python-Garbage-Collection-Mechanismus ausgelöst, um die Objekte zu recyceln, die recycelt werden können, und die Objekte, die nicht recycelt werden können wird ins Mittelalter verschoben und so weiter. Die Objekte im Alter sind die Objekte, die auch innerhalb des Lebenszyklus des gesamten Systems am längsten überlebt haben. Gleichzeitig basiert das generationsübergreifende Recycling auf der Mark-and-Sweep-Technologie.
Generationsrecycling dient auch als Pythons zusätzliche Garbage-Collection-Technologie zur Verarbeitung dieser Containerobjekte