Heim >Backend-Entwicklung >PHP-Problem >Was ist der PHP-Speicherverwaltungsmechanismus und der Garbage-Collection-Mechanismus?
PHP-Speicherverwaltungsmechanismus
var_dump(memory_get_usage()); //获取内存 $a = "laruence"; //定义一个变量 var_dump(memory_get_usage()); //定义变量之后获取内存 unset($a); //删除该变量 var_dump(memory_get_usage()); //删除变量后获取内存
Ausgabeergebnis:
int 262144 int 262144 int 262144
Wie aus dem Obigen ersichtlich ist, ist der Speicherverwaltungsmechanismus von PHP: Vorgegeben Erstellen Sie einen Speicherplatz zum Speichern von Variablen. Wenn der Speicherplatz nicht ausreicht, beantragen Sie einen neuen Speicherplatz.
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.
var_dump(memory_get_usage()); //获取内存 //定义100个变量 for($i=0;$i<100;$i++) { $a = "test".$i; $$a = "hello"; } //获取定义100个变量之后的内存 var_dump(memory_get_usage()); //定义100个变量并删除 for($i=0;$i<100;$i++) { $a = "test".$i; unset($$a); } //获取删除之后的内存 var_dump(memory_get_usage());
Ausgabeergebnis:
int 240040 int 257680 int 240856
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
PHP-Variablenspeicher wird in einem Zval-Container gespeichert
1. Typ 2. Wert 3. is_ref gibt an, ob eine Adressreferenz vorhanden ist 4. refcount Die Anzahl der Variablen, die auf den Wert verweisen
1. Beim Zuweisen einer Variablen: is_ref ist false und refcount ist 1
2 Variable a zu Variable b, Variable b speichert den Wert nicht sofort im Speicher, sondern zeigt zunächst auf den Wert der Variablen a, bis eine Operation an Variable a erfolgt$a = 1; xdebug_debug_zval('a');echo PHP_EOL;3. Da das Programm die Variable a erneut bearbeitet, wendet sich die Variable b an einen Speicherbereich und legt den Wert darin ab. Daher verringert sich der Refcount im Zavl-Container der Variablen a um 1 und wird 1. Die Variable c zeigt auf a, sodass der Refcount um 1 erhöht und 2 wird
$b = $a; xdebug_debug_zval('a');echo PHP_EOL;
Garbage Collection:
1. In Version 5.2 oder früher beurteilt PHP anhand des Refcount-Werts, ob es sich um Garbage handelt.Wenn der Refcount-Wert 0 ist, PHP gibt es als Müll freiDieser Recycling-Mechanismus ist fehlerhaft und Variablen mit Zirkelverweisen können nicht recycelt werden2 Der Garbage-Collection-Mechanismus wurde in Versionen nach 5.3 verbessertWenn festgestellt wird, dass der Refcount in einem Zval-Container zunimmt, was darauf hinweist, dass es sich nicht um Müll handeltWenn festgestellt wird, dass der Refcount in einem Zval-Container abnimmt, wird er auf 0 reduziert direkt als Garbage Collection behandelt werdenWenn festgestellt wird, dass der Refcount in einem ZVAL-Container abnimmt, er nicht auf 0 verringert wurde, legt PHP den Wert als mögliches verdächtiges Garbage-Objekt im Puffer ab . Wenn der Puffer den kritischen Wert erreicht, ruft PHP automatisch eine Methode auf, um jeden Wert zu durchlaufen. Wenn sich herausstellt, dass es sich um Müll handelt, bereinigen Sie ihn Weitere verwandte Fragen finden Sie unter Chinesische PHP-Website:Praktisches PHP-Video-Tutorial
Das obige ist der detaillierte Inhalt vonWas ist der PHP-Speicherverwaltungsmechanismus und der Garbage-Collection-Mechanismus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!