How does PHP do garbage collection (picture and text)

angryTom
Release: 2023-04-08 11:38:01
forward
2541 people have browsed it

How does PHP do garbage collection (picture and text)

#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;
Copy after login

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; };
Copy after login

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.

How does PHP do garbage collection (picture and text)

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.

How does PHP do garbage collection (picture and text)

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

How does PHP do garbage collection (picture and text)

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!

Related labels:
source:cnblogs.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!