Heim  >  Artikel  >  Backend-Entwicklung  >  Verständnis des PHP-Garbage-Collection-Mechanismus

Verständnis des PHP-Garbage-Collection-Mechanismus

巴扎黑
巴扎黑Original
2018-05-16 10:39:165455Durchsuche

[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 = &#39;I am test.&#39;; 
$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 = &#39;I am test.&#39;; 
$b = & $a;
$b = &#39;I will change?&#39;;                                                         
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 = &#39;I am test.&#39;; 
$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 = &#39;I am test.&#39;; 
$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 = &#39;I am test.&#39;; 
$b = & $a;
$a = null;echo &#39;$a = &#39;. $a ."n"; 
echo &#39;$b = &#39;. $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 = &#39;I am test.&#39;; 
$b = & $a;
$b = null;
echo &#39;$a = &#39;. $a ."n"; 
echo &#39;$b = &#39;. $b ."n"; 
?>
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn