Heim >Backend-Entwicklung >PHP-Tutorial >Verständnis des PHP-Garbage-Collection-Mechanismus
[Einführung] Der PHP-Garbage-Collection-Mechanismus ist erst nach PHP5 verfügbar. Jetzt werde ich Ihnen ein gewisses Verständnis des PHP-Garbage-Collection-Mechanismus vermitteln. Der vor PHP 5 und 3 verwendete Garbage-Collection-Mechanismus war ein einfacher Referenzzähler, das heißt, jedem Speicherobjekt wird eine Anzahl zugewiesen
Der PHP-Garbage-Collection-Mechanismus kam erst nach PHP5 Ich hoffe, dass es für alle Schüler hilfreich ist.
Der vor PHP 5.3 verwendete Garbage-Collection-Mechanismus ist eine einfache „Referenzzählung“, das heißt, jedem Speicherobjekt wird ein Zähler zugewiesen. Wenn das Speicherobjekt von einer Variablen referenziert wird, ist der Zähler 1; Variablenreferenz wird entfernt, Zähler -1; wenn Zähler = 0, bedeutet dies, dass das Speicherobjekt nicht verwendet wird, das Speicherobjekt zerstört wird und die Speicherbereinigung abgeschlossen ist.
Es gibt ein Problem mit der „Referenzzählung“, das heißt, wenn zwei oder mehr Objekte aufeinander verweisen, um einen Ring zu bilden, wird der Zähler des Speicherobjekts zu diesem Zeitpunkt nicht auf 0 reduziert. Diese Gruppe von Speicherobjekten ist nicht mehr nützlich, kann aber nicht recycelt werden, was zu Speicherverlusten führt.
Ab PHP 5.3 wird ein neuer Garbage Collection-Mechanismus verwendet, der auf der Referenzzählung basiert um Referenzen in Speicherobjekten zu erkennen, um Speicherlecks zu vermeiden.
Für diesen Algorithmus können Sie auf den folgenden Artikel verweisen, der die Hauptreferenz für diese kurze Zusammenfassung darstellt:): Eine kurze Diskussion über die Entwicklung des Garbage Collection-Algorithmus (Garbage Collection) in PHP5
Sehen Sie sich unten das Beispiel an
Beispiel 1: gc.php
<?php error_reporting(E_ALL); $a = 'I am test.'; $b = & $a; echo $b ."n"; ?>
Unnötig zu erwähnen, dass % php -f gc.php das Ausgabeergebnis sehr klar ist:
hy0kl% php -f gc.php I am test.
Okay, weiter:
Beispiel 2:
<?php error_reporting(E_ALL); $a = 'I am test.'; $b = & $a; $b = 'I will change?'; echo $a ."n"; echo $b ."n"; ?> 执行结果依然很明显: hy0kl% php -f gc.php I will change? I will change?
Schauen Sie sich bitte an:
Beispiel 3:
<?php error_reporting(E_ALL); $a = 'I am test.'; $b = & $a; unset($a); echo $a ."n"; echo $b ."n"; ?>
Müssen Sie darüber nachdenken?
hy0kl% php -f gc.php Notice: Undefined variable: a in /usr/local/www/apache22/data/test/gc.php on line 8 I am test.
Bist du etwas verwirrt?
Schau noch einmal:
Beispiel 4:
<?php error_reporting(E_ALL); $a = 'I am test.'; $b = & $a; unset($b); echo $a ."n"; echo $b ."n"; ?>
Tatsächlich, wenn du Beispiel 3 verstehst, dieses hier ist das gleiche wie Beispiel 3.
hy0kl% php -f gc.php I am test. Notice: Undefined variable: b in /usr/local/www/apache22/data/test/gc.php on line 9
Schauen Sie sich an:
Beispiel 5:
<?php error_reporting(E_ALL); $a = 'I am test.'; $b = & $a; $a = null;echo '$a = '. $a ."n"; echo '$b = '. $b ."n"; ?>
Was ist das erste Gefühl von Wildheit?
hy0kl% php -f gc.php $a = $b =
Ja, das ist das Ausgabeergebnis, richtig PHP GC-Leute, die bereits ein tiefes Verständnis von PHP GC haben, werden es nicht seltsam finden. Ehrlich gesagt war ich überrascht, als ich diesen Code zum ersten Mal ausführte, aber es gab mir Ein tieferes Verständnis von PHP GC. Das folgende Beispiel ist natürlich leicht zu verstehen:
Das obige ist das Verständnis der PHP-Garbage Collection Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!<?php error_reporting(E_ALL); $a = 'I am test.'; $b = & $a; $b = null; echo '$a = '. $a ."n"; echo '$b = '. $b ."n"; ?>