Heim  >  Artikel  >  Backend-Entwicklung  >  Analyse von Referenzen und Garbage Collection in PHP

Analyse von Referenzen und Garbage Collection in PHP

不言
不言Original
2018-09-04 17:43:591304Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Analyse von Referenzen und der Speicherbereinigung in PHP. Ich hoffe, dass er für Freunde hilfreich ist.

Jede PHP-Variable wird in einem Variablencontainer namens „zval“ gespeichert. Ein zval-Variablencontainer enthält zusätzlich zum Typ und Wert der Variablen zwei Bytes zusätzlicher Informationen. Der erste ist „is_ref“, ein Bool-Wert, der verwendet wird, um zu identifizieren, ob diese Variable zum Referenzsatz gehört. Durch dieses Byte kann die PHP-Engine gewöhnliche Variablen von Referenzvariablen unterscheiden. Da PHP Benutzern die Verwendung benutzerdefinierter Referenzen durch die Verwendung von & ermöglicht, gibt es im zval-Variablencontainer auch einen internen Referenzzählmechanismus, um die Speichernutzung zu optimieren. Das zweite zusätzliche Byte ist „refcount“, das verwendet wird, um die Anzahl der Variablen (auch Symbole genannt) anzugeben, die auf diesen zval-Variablencontainer verweisen. Alle Symbole existieren in einer Symboltabelle, wobei jedes Symbol einen Gültigkeitsbereich (Scope) hat, das Hauptskript (z. B. das über den Browser angeforderte Skript) und jede Funktion oder Methode ebenfalls einen Gültigkeitsbereich haben.

//Objekte in PHP werden als Referenz übergeben

is_ref = 0, refcount = 0 zval-Container wird am Ende der Skriptausführung zerstört

Zitat des offiziellen Beispiels

<?php
$a = array( &#39;one&#39; );
$a[] =& $a;
xdebug_debug_zval( &#39;a&#39; );
a: (refcount=2, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)='one',
   1 => (refcount=2, is_ref=1)=...
)

自引用(curcular reference,自己是自己的一个元素)的数组的zval

Durch die Ausführung von unset$a wird die Speicherzuordnung zwischen der Variablen und zval freigegeben, die geschlossene Schleife selbst existiert jedoch weiterhin

(refcount=1, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)=&#39;one&#39;,
   1 => (refcount=1, is_ref=1)=...
)

Zvals after removal of array with a circular reference demonstrating the memory leak

Aber zu diesem Zeitpunkt können keine Variablen in den ZVAL-Container manipuliert werden. Zu diesem Zeitpunkt ist er zu Speichermüll geworden und kann nicht freigegeben werden Recycling-Mechanismus: Vereinfacht ausgedrückt werden nach der Ausführung des Skripts alle vorhandenen Variablen refcount -1 für die Gesamtdaten, wenn sie auf 0 reduziert werden, werden sie als Müll beurteilt und der Speichercontainer wird zerstört

Verwandte Empfehlungen:

Welche Art von Müll kann durch den Garbage Collection-Mechanismus von PHP recycelt werden? PHP-Garbage-Collection-Mechanismus – Grundkenntnisse der Referenzzählung

Das obige ist der detaillierte Inhalt vonAnalyse von Referenzen und Garbage Collection in PHP. 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