Heim > Artikel > Backend-Entwicklung > Detaillierte Erläuterung des PHP-Garbage-Collection- und Speicherverwaltungsmechanismus
In diesem Artikel werden hauptsächlich die spezifischen Schritte und zugehörigen Betriebstechniken der PHP-Garbage Collection und des Speicherverwaltungsmechanismus vorgestellt. Ich hoffe, er kann Ihnen helfen.
Speicherverwaltungsmechanismus
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>1 var_dump(memory_get_usage()); //获取内存<br>2 $a = "laruence"; //定义一个变量<br>3 var_dump(memory_get_usage()); //定义变量之后获取内存<br>4 unset($a); //删除该变量<br>5 var_dump(memory_get_usage()); //删除变量后获取内存<br></span>
Wie aus dem Obigen ersichtlich ist, besteht der Speicherverwaltungsmechanismus von PHP darin: Geben Sie im Voraus einen Speicherplatz zum Speichern von Variablen an und beantragen Sie einen neuen Speicherplatz, wenn der Speicherplatz nicht ausreicht.
1. Variablennamen speichern und Symboltabellen haben.
2. Variablenwerte werden im Speicherplatz gespeichert.
3. Beim Löschen einer Variablen wird der Speicherplatz, in dem der Variablenwert gespeichert ist, freigegeben, die Symboltabelle, in der sich der Variablenname befindet, wird jedoch nicht verkleinert.
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>var_dump(memory_get_usage()); //获取内存<br>//定义100个变量for($i=0;$i<100;$i++)<br>{ $a = "test".$i;<br> $$a = "hello";<br>}//获取定义100个变量之后的内存var_dump(memory_get_usage());//定义100个变量并删除for($i=0;$i<100;$i++)<br>{ $a = "test".$i; unset($$a);<br>}//获取删除之后的内存var_dump(memory_get_usage());</span>
Wie oben zu sehen ist, ist der Speicher nach dem Löschen zwar kleiner, aber immer noch größer als vor der Definition der Variablen Dies liegt daran, dass zwar der Wert der Variablen gelöscht wird, der Variablenname jedoch nicht gelöscht wird.
PHP-Garbage-Collection-Mechanismus
Der PHP-Variablenspeicher wird in einem Zval-Container gespeichert
1 . Geben Sie 2 ein. Wert 3. is_ref gibt an, ob eine Adressreferenz vorhanden ist. 4. refcount ist die Anzahl der Variablen, die auf den Wert verweisen
1. Beim Zuweisen von Werten zu Variablen: is_ref ist falsch und refcount ist 1
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>$a = 1;<br>xdebug_debug_zval('a');echo PHP_EOL;</span>
2 Weisen Sie den Wert der Variablen a der Variablen b zu Speicher sofort, aber zuerst Zeigt auf den Wert der Variablen a, bis eine Operation an der Variablen a erfolgt
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>$b = $a;<br>xdebug_debug_zval('a');echo PHP_EOL;</span>
3 Weil das Programm funktioniert Variable a erneut, sodass Variable b einen Speicherbereich anwendet und den Wert darin ablegt. Daher verringert sich der Refcount im Zavl-Container der Variablen a um 1 und wird 1. Die Variable c zeigt auf a, sodass sich der Refcount um 1 erhöht und 2 wird
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>$c = &$a;<br>xdebug_debug_zval('a');echo PHP_EOL;<br>xdebug_debug_zval('b');echo PHP_EOL;<br></span>
Garbage-Collection-Mechanismus
1 Beurteilen Sie, ob es auf dem Refcount-Wert Garbage basiert
Wenn der Refcount-Wert 0 ist, gibt PHP ihn als Müll frei
Dieser Recyclingmechanismus ist fehlerhaft, für Variablen mit Zirkelverweisen Kann nicht recycelt werden
2. Der Garbage-Collection-Mechanismus wurde nach Version 5.3 verbessert
Wenn der Refcount in einem Zval-Container festgestellt wird, dass er zunimmt, bedeutet dies, dass es sich nicht um Müll handelt
Wenn festgestellt wird, dass der Refcount in einem Zval-Container abnimmt, wird er direkt als Garbage Collection behandelt, wenn er auf 0 reduziert wird.
Wenn dies der Fall ist Es wurde festgestellt, dass der Refcount in einem ZVAL-Container abnimmt. Wenn er nicht auf 0 reduziert wird, legt PHP den Wert als verdächtiges Objekt im Puffer ab, bei dem es sich möglicherweise um Müll handelt.
Wenn der Puffer den kritischen Wert erreicht, ruft PHP automatisch eine Methode auf, um jeden Wert zu durchlaufen und ihn zu bereinigen, wenn festgestellt wird, dass es sich um Müll handelt
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des PHP-Garbage-Collection- und Speicherverwaltungsmechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!