Dieser Artikel bietet Ihnen eine Einführung in den Garbage-Collection-Mechanismus (Codebeispiele) der zugrunde liegenden Prinzipien von PHP. Ich hoffe, dass er für Sie hilfreich ist .
Der PHP-Garbage-Collection-Mechanismus ist ein vertrauter, aber nicht sehr vertrauter Inhalt für PHPer. Wie recycelt PHP also unnötigen Speicher?
Die interne Speicherstruktur von PHP-Variablen
Zunächst müssen Sie die Grundkenntnisse verstehen, um das Verständnis der Prinzipien der Garbage Collection zu erleichtern. Jeder weiß, dass PHP in C geschrieben ist, daher hängt die interne Speicherstruktur von PHP-Variablen auch mit der C-Sprache zusammen, dh der Struktur von zval:
struct _zval_struct { union { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; zend_object_value obj; zend_ast *ast; } value; //变量value值 zend_uint refcount__gc; //引用计数内存中使用次数,为0删除该变量 zend_uchar type; //变量类型 zend_uchar is_ref__gc; //区分是否是引用变量 };
Aus dem Inhalt der obigen Struktur haben wir Sie können sehen, dass jede PHP-Variable aus vier Teilen besteht: Variablentyp, Wert, Referenzanzahl und ob es sich um eine Referenzvariable handelt.
Hinweis: Die obige ZVAL-Struktur ist die Struktur nach PHP5.3. 3, der Garbage-Collection-Mechanismus ist GC, daher gibt es kein _gc im Namen; nach der PHP7-Version wurde die ZVAL-Struktur aufgrund von Leistungsproblemen neu geschrieben wird hier nicht mehr angegeben
Verstehen der PHP-Variablen Nach der internen Speicherstruktur lernen wir die Prinzipien im Zusammenhang mit der PHP-Variablenzuweisung und dem frühen Garbage-Collection-Mechanismus kennen
Variablencontainer
Nicht-Array- und Objektvariablen
Jede Konstante Beim Zuweisen eines Werts zu einer Variablen wird ein Variablencontainer
generiert. Beispiel:
$a = '许铮的技术成长之路'; xdebug_debug_zval('a')
Ergebnis:
a: (refcount=1, is_ref=0)='许铮的技术成长之路'
Array- und Objektvariablen
Beispiel:
$b = [ 'name' => '许铮的技术成长之路', 'number' => 3 ]; xdebug_debug_zval('b')
Ergebnis:
b: (refcount=1, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 'number' => (refcount=1, is_ref=0)=3)
Prinzip der Zuweisung (Copy-on-Write-Technologie)
Beispiel:
$a = [ 'name' => '许铮的技术成长之路', 'number' => 3 ]; //创建一个变量容器,变量a指向给变量容器,a的ref_count为1 $b = $a; //变量b也指向变量a指向的变量容器,a和b的ref_count为2 xdebug_debug_zval('a', 'b'); $b['name'] = '许铮的技术成长之路1';//变量b的其中一个元素发生改变,此时会复制出一个新的变量容器,变量b重新指向新的变量容器,a和b的ref_count变成1 xdebug_debug_zval('a', 'b');
Ergebnis :
a: (refcount=2, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 'number' => (refcount=1, is_ref=0)=3) b: (refcount=2, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 'number' => (refcount=1, is_ref=0)=3) a: (refcount=1, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 'number' => (refcount=1, is_ref=0)=3) b: (refcount=1, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路1', 'number' => (refcount=1, is_ref=0)=3)
Wenn also Variable a der Variablen b zugewiesen wird, gibt es keine sofortige Generierung eines neuen Variablencontainers, sondern verweist die Variable b auf den Variablencontainer, auf den die Variable a zeigt, d. ; und wenn sich ein Element der Variablen b ändert, erfolgt tatsächlich eine Kopie des Variablencontainers, d Auf 0 gelöscht bedeutet dies, dass der Variablencontainer zerstört wird und das Speicherrecycling erreicht wird Durch Zirkelverweis verursachtes Leck
Vor PHP5.3 gibt es jedoch eine Lücke im Garbage-Collection-Mechanismus, d Wenn zu diesem Zeitpunkt gelöscht wird, wird dieser Variablencontainer nicht gelöscht, da seine untergeordneten Elemente immer noch auf den Variablencontainer verweisen. Da jedoch kein Symbol vorhanden ist, das auf den Variablencontainer zeigt, kann es nicht gelöscht werden, sodass bis zur Ausführung ein Speicherverlust auftritt des Skripts endet 写时复制技术
$a = "许铮的技术成长之路"; $b = $a; xdebug_debug_zval('a'); unset($b); xdebug_debug_zval('a');
php5.3版本之前的垃圾回收机制
Beispiel:
a: (refcount=2, is_ref=0)='许铮的技术成长之路' a: (refcount=1, is_ref=0)='许铮的技术成长之路'
Neuer Müllsammelmechanismus
Kriterien für die Bestätigung als Müll
1. Wenn der Referenzzähler auf Null reduziert wird, wird der Variablencontainer gelöscht (frei) und ist kein Müll
2 Wenn der Referenzzähler eines zval reduziert wird und immer noch größer als 0 ist, dann gelangt in den Müllkreislauf. Zweitens können Sie während eines Garbage-Zyklus herausfinden, welche Teile Garbage sind, indem Sie prüfen, ob die Referenzanzahl um 1 reduziert wird und welche Variablencontainer keine Referenzen haben.
Zusammenfassung
Garbage-Collection-Mechanismus: 1. Basierend auf dem Referenzzählmechanismus von PHP (nur dieser Mechanismus war vor PHP5.3 verfügbar)
2 Wenn PHP gleichzeitig feststellt, dass ein ZVAL mit einem Zirkelverweis vorhanden ist, wird dieser in den Root-Puffer gelegt. Wenn der Root-Puffer die angegebene Anzahl in der Konfigurationsdatei erreicht, wird eine Speicherbereinigung durchgeführt, um den verursachten Speicherverlust zu beheben durch Zirkelverweise. Problem (php5.3 hat mit der Einführung dieses Mechanismus begonnen)Das obige ist der detaillierte Inhalt vonEinführung in den Garbage-Collection-Mechanismus der zugrunde liegenden Prinzipien von PHP (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!