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é.
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.
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 gratuite5. Ajoutez refcount+1 à refcount!=0.
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!