Heim > Artikel > Backend-Entwicklung > Wie führt PHP die Garbage Collection durch (Bild und Text)?
Wie führt PHP die Speicherbereinigung durch?
Enthält einen Vergleich der Variablenimplementierung und Garbage Collection in PHP 5 und PHP 7
Variablenimplementierung
PHP-Variablen sind schwach typisiert. kann Ganzzahlen, Gleitkommazahlen, Zeichenfolgen und andere Typen darstellen. PHP-Variablen werden durch die Struktur zval
PHP 5.* zval und zend_value Struktur
struct _zval_struct { // 结构体 zvalue_value value; zend_uint refcount__gc; zend_uchar type; zend_uchar is_ref__gc; } typedef union _zvalue_value { // 联合体 long lval; double dval; struct { char *val; int len; } str; // 字符串 HashTable *ht; // 数组 zend_object_value obj; // 对象 zend_ast *ast; } zvalue_value;
PHP 7.0 zval und zend_value Struktur
struct _zval_struct { union { zend_long lval; /* long value */ double dval; /* double value */ zend_refcounted *counted; zend_string *str; zend_array *arr; zend_object *obj; zend_resource *res; zend_reference *ref; zend_ast_ref *ast; zval *zv; void *ptr; zend_class_entry *ce; zend_function *func; struct { uint32_t w1; uint32_t w2; } ww; } value; union { struct { ZEND_ENDIAN_LOHI_4( zend_uchar type, /* active type */ zend_uchar type_flags, zend_uchar const_flags, zend_uchar reserved) /* call info for EX(This) */ } v; uint32_t type_info; } u1; union { uint32_t var_flags; uint32_t next; /* hash collision chain */ uint32_t cache_slot; /* literal cache slot */ uint32_t lineno; /* line number (for ast nodes) */ uint32_t num_args; /* arguments number for EX(This) */ uint32_t fe_pos; /* foreach position */ uint32_t fe_iter_idx; /* foreach iterator index */ } u2; };
PHP5 und PHP7 Vergleich von dargestellt Referenzzählung
php 5.* Die Referenzzählung von Operationen wie der Variablenzuweisung erfolgt wie in der Abbildung gezeigt. Im vorletzten Schritt wird eine Zirkelreferenz gebildet und nach der nicht gesetzten Operation Müll wird generiert.
Die Anzahl von PHP 7 wird auf einen bestimmten Wert gesetzt und zval verfügt nicht über Copy-on-Write (Split-on-Write).
Und PHP 7 verfügt über eine spezielle zend_reference, die zur Darstellung von Referenzen verwendet wird.
Mit dem oben genannten Wissen über die Speicherung von PHP-Variablen können wir verstehen, wie PHP die Speicherbereinigung durchführt.
Was ist Müll?
Zuerst müssen wir definieren, was Müll ist.
1. Wenn refcount steigt, ist es nicht
2. Wenn refcount gleich 0 ist, wird es direkt gelöscht
3 ungleich 0, es ist Müll
Garbage Collection
1. PHP7 erfordert, dass Datentypen Arrays und Objekte sind, und type_flag ist IS_TYPE_COLLECTABLE
2. Existiert nicht im Puffer
3. Wurde nicht markiert
4. In Lila markiert und im Puffer platziert
Recycling-Algorithmus
Papier: https://researcher.watson.ibm.com/researcher/files/us-bacon/Bacon01Concurrent.pdf
PHP Version 5.3 und spätere Versionen
1. Müll in einen Root-Pool legen
2. Müllsammlung durchführen, wenn 10.000 Knoten erreicht sind
3. Durchlaufen Sie die Knoten in der doppelt verknüpften Liste refcount-1
4. Durchlaufen Sie die doppelt verknüpfte Liste und löschen Sie den Knoten mit refcount=0 zur freien Warteschlange
5. Fügen Sie refcount+1 zu refcount!=0 hinzu
Das obige ist der detaillierte Inhalt vonWie führt PHP die Garbage Collection durch (Bild und Text)?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!