Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist der PHP-Garbage-Collection-Mechanismus? Detaillierte Erläuterung des PHP-Garbage-Collection-Mechanismus

Was ist der PHP-Garbage-Collection-Mechanismus? Detaillierte Erläuterung des PHP-Garbage-Collection-Mechanismus

云罗郡主
云罗郡主Original
2019-01-21 14:49:533879Durchsuche

Der Garbage-Collection-Mechanismus von PHP kann einfach als Referenzzählung und COW-Mechanismus zum Kopieren beim Schreiben zusammengefasst werden.

Dieser Artikel vermittelt Ihnen hauptsächlich das Wissen über die Beherrschung des PHP-Garbage-Collection-Mechanismus und hofft, allen zu helfen. [Empfohlenes Tutorial: PHP-Tutorial]

Grundkenntnisse der Referenzzählung

Die Antwort auf der offiziellen Website lautet wie folgt: Jede PHP-Variable hat eine Zval-Variable in einer Variablen Container namens „zval“ Zusätzlich zum Typ und Wert der Variablen enthält der Container auch zwei Bytes zusätzlicher Informationen: is_ref und refcount. is_ref ist ein Bool-Wert, der verwendet wird, um zu identifizieren, ob diese Variable zu einem Referenzsatz gehört. Durch dieses Byte kann die PHP-Engine gewöhnliche Variablen von Referenzvariablen unterscheiden, um die Anzahl der Variablen darzustellen, die auf diesen zval-Variablencontainer verweisen. In PHP5 ist der Speicher von zval (Heap) getrennt ) zugewiesen (mit wenigen Ausnahmen), muss PHP wissen, welche Zvals verwendet werden und welche freigegeben werden müssen. Dies erfordert also die Verwendung der Referenzzählung: Der Wert von refcount__gc in zval wird verwendet, um die Häufigkeit zu speichern, mit der zval selbst referenziert wird. In der b = 12-Anweisung wird beispielsweise 12 von zwei Variablen referenziert, sodass der Referenzzähler gleich ist 2. Wenn der Referenzzähler 0 wird, bedeutet dies, dass die Variable nicht mehr verwendet wird und der Speicher freigegeben werden kann.

ist wie folgt:

<?php
//php zval变量容器
$a = 1;
$b = 1;
$c = &$a;
$d = $b;
$e = range(0, 3);
xdebug_debug_zval(&#39;a&#39;);
xdebug_debug_zval(&#39;b&#39;);
xdebug_debug_zval(&#39;c&#39;);
xdebug_debug_zval(&#39;d&#39;);
xdebug_debug_zval(&#39;e&#39;); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Das Ergebnis ist wie folgt

a: (refcount=2, is_ref=1), int 1b: (refcount=2, is_ref= 0), int 1c : (refcount=2, is_ref=1), int 1d: (refcount=2, is_ref=0), int 1e: (refcount=1, is_ref=0), array (size=4) 0 = > (refcount= 1, is_ref=0), int 0 1 => (refcount=1, is_ref=0), int 1 2 => (refcount=1, is_ref=0), int 3

<?php
//php zval变量容器
$a = 1;
$b = 1;
$c = &$a;
$d = $b;
$e = range(0, 3);
xdebug_debug_zval(&#39;a&#39;);
xdebug_debug_zval(&#39;b&#39;);
xdebug_debug_zval(&#39;c&#39;);
xdebug_debug_zval(&#39;d&#39;);
xdebug_debug_zval(&#39;e&#39;); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Das Ergebnis ist wie folgt a: (refcount=2, is_ref=1) int 1b: (refcount=0, is_ref=0) int 1c: (refcount=2, is_ref=1 ) int 1d: (refcount=0, is_ref=0) int 1e: (refcount=1, is_ref=0) array (size=4) 0 => 0) int 0 1 => (refcount=0, is_ref=0) int 1 2 => (refcount=0, is_ref=0) int 2 3 => (refcount=0, is_ref=0) int 3

Gewöhnliche Variablen sind nicht vorhanden. Merken Sie sich dann Ihre eigene Zahl. Was ist Müll? Nur unter Kriterium 3 sammelt der GC den Zval und verwendet dann einen neuen Algorithmus Bestimmen Sie, ob der Zval Müll ist. Wie kann man also beurteilen, ob eine solche Variable echter Müll ist? Einfach ausgedrückt bedeutet dies, dass für jedes Element in diesem zval eine Refcount-Operation ausgeführt wird. Wenn der refcount von zval = 0 ist, ist dieser zval ein Müll zval wird immer noch verwendet, kein Müll. Wenn der refcount eines zval auf mehr als 0 reduziert wird, kann der zval nicht freigegeben werden zval kann zu Müll werden.

Das obige ist der detaillierte Inhalt vonWas ist der PHP-Garbage-Collection-Mechanismus? Detaillierte Erläuterung des PHP-Garbage-Collection-Mechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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