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 keinen externen Verweis auf A oder B. Obwohl ihre Referenzanzahlen beide 1 sind, sollten sie offensichtlich recycelt werden. Beispiel:
a = { } # a 的引用为 1 b = { } # b 的引用为 1 a['b'] = b # b 的引用增 1,b的引用为2 b['a'] = a # a 的引用增 1,a的引用为 2 del a # a 的引用减 1,a的引用为 1 del b # b 的引用减 1, b的引用为 1
In diesem Beispiel verringert die del-Anweisung die Referenzanzahl von a und b und löscht die für die Referenzen verwendeten Variablennamen. Da jedoch die beiden Objekte jeweils eine Referenz auf das andere Objekt enthalten, kann auf die letzten beiden Objekte nicht über den Namen zugegriffen werden , Der Referenzzähler sinkt jedoch nicht auf Null. 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, die Objekte bilden die Knoten von Dieser gerichtete Graph und Referenzbeziehungen 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, Zirkelverweisprobleme für Zeichenfolgen und Zahlen zu verursachen Objekte. Python verwendet eine doppelt verknüpfte Liste, um diese Containerobjekte zu organisieren.
Generationsrecycling
Generationsrecycling ist eine Operationsmethode, die den Speicher basierend auf der Überlebenszeit des Objekts in verschiedene Sammlungen aufteilt. Python unterteilt den Speicher in drei „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 nimmt ab Die Überlebenszeit des Objekts erhöht sich. 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