Heim > Artikel > Backend-Entwicklung > Wie PHP den Speicher verwaltet
Die Speicherverwaltung umfasst im Allgemeinen Folgendes:
Ob genügend Speicher für die Nutzung unseres Programms vorhanden ist;
So erhalten Sie einen Teil des Speichers aus genügend verfügbarem Speicher;
Für den verwendeten Speicher, ob er zerstört und anderen Programmen zur Verwendung zugewiesen werden kann. (Empfohlenes Lernen: PHP-Programmierung vom Einstieg bis zur Kompetenz)
Entsprechend umfasst PHPs Speicherverwaltung auch solche Inhalte, diese Speicher werden jedoch durch Makros im ZEND-Kernel dargestellt als Schnittstelle zur externen Nutzung bereitgestellt.
Die beiden letztgenannten Operationen entsprechen dem Emalloc-Makro bzw. dem Efree-Makro, und die erste Operation kann anhand des vom Emalloc-Makro zurückgegebenen Ergebnisses erkannt werden.
Die Speicherverwaltung von PHP kann als hierarchisch betrachtet werden. Es ist in drei Schichten unterteilt: Speicherschicht (Storage), Heap-Schicht (Heap) und Schnittstellenschicht (emalloc/efree).
Die Speicherschicht beantragt tatsächlich Speicher vom System über Funktionen wie malloc() und mmap() und gibt den angeforderten Speicher über die Funktion free() frei. Die Speicherschicht gilt normalerweise für relativ große Speicherblöcke. Der hier angewendete große Speicher bezieht sich nicht auf den von der Speicherschichtstruktur benötigten Speicher in großen Blöcken Die Rolle der Speicher- und Speicherschicht besteht darin, die Speicherzuweisungsmethode für die Heap-Schicht transparent zu machen.
Wie im Bild gezeigt, PHP-Speichermanager. PHP verfügt über 4 Speicherzuweisungsschemata in der Speicherschicht: malloc, win32, mmap_anon, mmap_zero. Wenn das Makro ZEND_WIN32 festgelegt ist, wird HeapAlloc zum Zuweisen von Speicher verwendet Die verbleibenden zwei Speicherschemata sind anonyme Speicherzuordnungen, und das Speicherschema von PHP kann durch Festlegen von Umgebungsvariablen geändert werden.
PHP内存管理机制 var_dump(memory_get_usage()); //获取内存 $a = "laruence"; //定义一个变量 var_dump(memory_get_usage()); //定义变量之后获取内存 unset($a); //删除该变量 var_dump(memory_get_usage()); //删除变量后获取内存 从上面可以看出php的内存管理机制是:预先给出一块空间,用来存储变量,当空间不够时,再申请一块新的空间。 1.存储变量名,存在符号表。 2.变量值存储在内存空间。 3.在删除变量的时候,会将变量值存储的空间释放,而变量名所在的符号表不会减小。 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()); 从上面可以看出,虽然删除后内存变小了,但还是比没定义变量之前时大,这是因为虽然删除了变量的值,但变量名没有被删除。 php垃圾回收机制 PHP变量存储是存储在一个zval容器里面的 1.类型 2.值 3.is_ref 代表是否有地址引用 4.refcount 指向该值的变量数量 1.变量赋值的时候:is_ref为false refcount为1 $a = 1; xdebug_debug_zval('a'); echo PHP_EOL; 2.将变量a的值赋给变量b,变量b不会立刻去在内存中存储值,而是先指向变量a的值,一直到变量a有任何操作的时候 $b = $a; xdebug_debug_zval('a'); echo PHP_EOL; 3.因为程序又操作了变量a,所以变量b会自己申请一块内存将值放进去。所以变量a的zavl容器中refcount会减1变为1,变量c指向a,所以refcount会加1变为2 $c = &$a; xdebug_debug_zval('a'); echo PHP_EOL; xdebug_debug_zval('b'); echo PHP_EOL;
Garbage Collection:
1. In Version 5.2 oder früher beurteilt PHP anhand der Refcount, ob es sich um Garbage handelt Wert
Wenn der Refcount-Wert 0 ist, gibt PHP ihn als Müll frei
Dieser Recyclingmechanismus ist fehlerhaft und Variablen mit Zirkelverweisen können nicht recycelt werden
2 Diese Version verbessert den Garbage-Collection-Mechanismus
Wenn festgestellt wird, dass der Refcount in einem Zval-Container zunimmt, bedeutet dies, dass es sich nicht um Müll handelt
Wenn festgestellt wird, dass der Refcount in einem Zval-Container zunimmt sinkt, wenn er auf 0 sinkt, wird er direkt als Garbage Collection betrachtet
Wenn festgestellt wird, dass der Refcount in einem Zval-Container abnimmt und nicht auf 0 reduziert wurde, fügt PHP den Wert in den ein buffer als verdächtiges Objekt, 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 vonWie PHP den Speicher verwaltet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!