Maison >développement back-end >tutoriel php >Comment PHP effectue-t-il le garbage collection (image et texte)

Comment PHP effectue-t-il le garbage collection (image et texte)

angryTom
angryTomavant
2020-01-31 17:33:412659parcourir

Comment PHP effectue-t-il le garbage collection (image et texte)

Comment PHP effectue-t-il le garbage collection ?

Contient une comparaison de l'implémentation des variables et du garbage collection en PHP 5 et PHP 7

Implémentation des variables

Les variables PHP sont faiblement typées, peut représenter des entiers, des nombres à virgule flottante, des chaînes et d'autres types. Les variables PHP sont représentées par la structure zval

PHP 5.* zval et zend_value structure

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 et zend_value structure

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 et PHP7 Comparaison de comptage de références

php 5.* Le comptage de références d'opérations telles que l'affectation de variables est comme indiqué dans la figure Dans l'avant-dernière étape, une référence circulaire sera formée, et après l'opération de non-définition, des déchets. sera généré.

Comment PHP effectue-t-il le garbage collection (image et texte)

Le nombre de PHP 7 est placé dans une valeur spécifique, et zval n'a pas de copie sur écriture (split-on-write).

Et PHP 7 a un zend_reference spécial utilisé pour représenter les références.

Comment PHP effectue-t-il le garbage collection (image et texte)

Avec les connaissances ci-dessus sur le stockage de variables PHP, nous pouvons comprendre comment PHP effectue le garbage collection.

Qu'est-ce que les déchets

Tout d'abord, nous devons définir ce qu'est un déchet.

1. Si le refcount augmente, ce n'est pas

2 Si le refcount est égal à 0, il sera effacé directement

Si le refcount diminue, et c'est le cas. n'est pas égal à 0, c'est une poubelle

Garbage collection

1 php7 nécessite que les types de données soient des tableaux et des objets, et type_flag est IS_TYPE_COLLECTABLE

. 2. N'existe pas dans le tampon

3. N'a pas été marqué

4 Marqué en violet et placé dans le tampon

Algorithme de recyclage .

Article : https://researcher.watson.ibm.com/researcher/files/us-bacon/Bacon01Concurrent.pdf

PHP version 5.3 et versions ultérieures

1. Mettez les déchets dans un pool racine

2. Effectuez le garbage collection lorsque 10 000 nœuds sont atteints

3 Parcourez les nœuds dans la liste doublement chaînée refcount-1<.>

4. Parcourez la liste doublement chaînée et supprimez le nœud avec refcount=0 dans la file d'attente gratuite

5. Ajoutez refcount+1 à refcount!=0

. Comment PHP effectue-t-il le garbage collection (image et texte)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer