PHP는 어떻게 가비지 수집을 수행하나요?
php 5와 php7 사이의 변수 구현과 가비지 수집을 비교한 내용이 포함되어 있습니다.
변수 구현
PHP 변수는 약한 유형이며 정수, 부동 소수점 숫자, 문자열 및 기타 유형을 나타낼 수 있습니다. PHP 변수는 zval 구조로 표현됩니다
PHP 5.* zval 및 zend_value 구조
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 및 zend_value 구조
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와 PHP7의 참조 계산 비교
php 5.* 변수 할당 등 작업 참조 카운팅은 그림에 나와 있습니다. 두 번째 단계에서는 순환 참조가 형성되고 설정되지 않은 작업 후에는 가비지가 생성됩니다.
PHP 7의 개수는 특정 값에 배치되며 zval에는 쓰기 시 복사(쓰기 시 분할) 기능이 없습니다.
그리고 PHP 7에는 참조를 나타내는 특별한 zend_reference가 있습니다.
PHP 변수 저장에 대한 위의 지식을 통해 우리는 PHP가 가비지 수집을 수행하는 방법을 이해할 수 있습니다.
쓰레기란 무엇인가
먼저 쓰레기가 무엇인지 정의해야 합니다.
1. refcount가 증가하면
2. refcount가 0이 되면 바로 지워집니다.
3. refcount가 감소하고 0이 아니면 가비지입니다.
가비지 컬렉션1. php7 요구 사항 데이터 유형은 배열이고, type_flag는 IS_TYPE_COLLECTABLE
2입니다. 버퍼
3에 표시되지 않았습니다. 보라색으로 버퍼에 배치
재활용 알고리즘
Paper: https://researcher.watson.ibm.com/researcher/files/us-bacon/Bacon01Concurrent.pdf
PHP 5.3 버전 및 이후 버전1. 가비지를 루트 풀에 넣습니다. 2. 10,000개의 노드에 도달하면 가비지 수집을 수행합니다.
3. 이중 연결 목록의 노드 refcount-1을 순회하고 노드를 삭제합니다. refcount=0을 사용하여 무료 대기열
5. refcount!=0의 경우 refcount+1
위 내용은 PHP는 어떻게 가비지 수집을 수행합니까(그림 및 텍스트)?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!