#How does PHP do garbage collection?
Includes comparison of variable implementation and garbage collection in php 5 and php7
Variable implementation
PHP variables are weakly typed , can represent integers, floating point numbers, strings and other types. PHP variables are represented by the structure zval
PHP 5.* zval and zend_value structures
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 and zend_value structures
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 and PHP7 Comparison of reference counting
php 5.* Reference counting for operations such as variable assignment is as shown in the figure. In the penultimate step, a circular reference will be formed, and after the unset operation, garbage will be generated.
The count of PHP 7 is placed in a specific value, and zval does not have copy-on-write (split-on-write).
And PHP 7 has a special zend_reference used to represent references.
With the above knowledge about PHP variable storage, we can understand how PHP does garbage collection.
What is garbage
First, we need to define what garbage is.
1. If refcount increases, it is not
2. If refcount is equal to 0, it will be cleared directly.
3. If refcount decreases, and it is not equal to 0, it is garbage.
Garbage Collection
1. php7 requires the data type to be array and object, and type_flag is IS_TYPE_COLLECTABLE
2. It does not exist in the buffer
3. Not marked yet
4. Marked as purple and placed in the buffer
Recycling algorithm
Paper: https://researcher.watson.ibm.com/researcher/files/us-bacon/Bacon01Concurrent.pdf
PHP version 5.3 and later versions
1. Put garbage into a root pool
2. Carry out garbage collection when 10,000 nodes are reached
3. Traverse the node refcount-1 in the doubly linked list
4. Traverse the doubly linked list and delete the node with refcount=0 to the free queue
5. For refcount 1 with refcount!=0
The above is the detailed content of How does PHP do garbage collection (picture and text). For more information, please follow other related articles on the PHP Chinese website!