Heim >Backend-Entwicklung >Python-Tutorial >Detaillierte Einführung in den Python-Garbage-Collection-Mechanismus
PythonDer standardmäßige 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 del The Die Anweisung reduziert die Referenzanzahl von a und b und löscht den als Referenz verwendeten Variablennamen. Da jedoch die beiden Objekte jeweils eine Referenz auf das andere Objekt enthalten, obwohl auf die letzten beiden Objekte nicht über den Namen zugegriffen werden kann, 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 Zirkelverweisproblem zu lösen, führte Python zwei GC-Mechanismen ein: Mark-Sweep und Generational Collection.
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 dieses gerichteten Graphen, und die Referenzbeziehungen bilden die Kanten dieses gerichteten Graphen. Beginnen Sie mit dem Stammobjekt (Wurzel-Objekt) und durchlaufen Sie das Objekt entlang der gerichteten Kante . Die erreichbaren Objekte werden als nützliche Objekte markiert, und die nicht erreichbaren Objekte sind die zu löschenden Objekte. Die sogenannten Root-Objekte sind einige globale Referenzobjekte und Referenzen im -Funktions--Stack. Die durch diese Referenzen referenzierten Objekte können nicht gelöscht werden.
Markieren Sie den Löschalgorithmus als Pythons zusätzliche Garbage-Collection-Technologie, die sich hauptsächlich mit einigen Containerobjekten befasst, z. B. Liste, Diktat, Tupel, Instanz usw., da für Zeichenfolge , ist es für numerische Objekte unmöglich, Zirkelverweisprobleme zu verursachen. Python verwendet eine doppelt verknüpfte Liste, um diese Containerobjekte zu organisieren.
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 werden ins Mittelalter verschoben und so weiter. Die Objekte im Alter sind die Objekte, die am längsten überlebt haben, selbst innerhalb des Lebenszyklus des gesamten Systems. 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
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in den Python-Garbage-Collection-Mechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!