Heim  >  Artikel  >  Backend-Entwicklung  >  Wie führt PHP die Garbage Collection durch (Bild und Text)?

Wie führt PHP die Garbage Collection durch (Bild und Text)?

angryTom
angryTomnach vorne
2020-01-31 17:33:412630Durchsuche

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.

Wie führt PHP die Garbage Collection durch (Bild und Text)?

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.

Wie führt PHP die Garbage Collection durch (Bild und Text)?

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

Wie führt PHP die Garbage Collection durch (Bild und Text)?

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen