이 기사는 PHP 가비지 수집 메커니즘(코드 예제)에 대한 소개를 제공합니다. 이는 특정 참조 가치가 있으므로 도움이 될 수 있습니다.
php의 가비지 수집 메커니즘은 참조 카운팅, 기록 중 복사 및 COW 메커니즘으로 간단히 요약할 수 있습니다.
이 기사는 주로 PHP의 가비지 수집 메커니즘을 마스터하는 지식을 공유하여 모든 사람에게 도움이 되기를 바랍니다.
참조 카운팅에 대한 기본 지식
공식 홈페이지의 답변은 다음과 같습니다 각 PHP 변수는 "zval"이라는 변수 컨테이너에 존재합니다. 변수 값에는 2바이트의 추가 정보도 포함됩니다. is_ref 및 refcount is_ref는 이 변수가 참조 세트에 속하는지 여부를 식별하는 데 사용되는 부울 값입니다. 이 바이트를 통해 PHP 엔진은 일반 변수와 참조 변수를 구별할 수 있습니다.refcount는 이 zval 변수 컨테이너를 가리키는 변수의 수를 나타내는 데 사용됩니다.PHP5의 참조 카운팅PHP5에서는 zval의 메모리가 별도로 할당됩니다. 힙(몇 가지 예외 제외)에서 PHP는 어떤 zval이 사용 중이고 어떤 zval을 해제해야 하는지 알아야 합니다. 따라서 이를 위해서는 참조 계산을 사용해야 합니다. zval의 refcount__gc 값은 zval 자체가 참조된 횟수를 저장하는 데 사용됩니다. 예를 들어 b = 12 문에서 12는 두 변수에 의해 참조됩니다. 참조 횟수는 2입니다. 참조 횟수가 0이 되면 해당 변수는 더 이상 사용되지 않으며 메모리를 해제할 수 있다는 의미입니다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 은 다음과 같습니다.
<?php
//php zval变量容器
$a = 1;
$b = 1;
$c = &$a;
$d = $b;
$e = range(0, 3);
xdebug_debug_zval('a');
xdebug_debug_zval('b');
xdebug_debug_zval('c');
xdebug_debug_zval('d');
xdebug_debug_zval('e'); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
结果如下
a:(refcount=2, is_ref=1),int 1b:(refcount=2, is_ref=0),int 1c:(refcount=2, is_ref=1),int 1d:(refcount=2, is_ref=0),int 1e:(refcount=1, is_ref=0), array (size=4) 0 => (refcount=1, is_ref=0),int 0 1 => (refcount=1, is_ref=0),int 1 2 => (refcount=1, is_ref=0),int 2 3 => (refcount=1, is_ref=0),int 3
모든 변수에는 고유한 번호가 있습니다zval in PHP7 PHP7 구현 방식. 가장 기본적인 변화는 zval에 필요한 메모리가 더 이상 힙과 별도로 할당되지 않으며 참조 카운트가 더 이상 자체적으로 저장되지 않는다는 것입니다. 문자열, 배열, 객체 등 복잡한 데이터 유형의 참조 횟수는 자체적으로 저장됩니다. 이 구현에는 다음과 같은 이점이 있습니다. 단순 데이터 유형은 메모리를 별도로 할당할 필요가 없으며 계산할 필요도 없습니다. 객체에서는 더 이상 두 개의 카운트가 없으며 객체 자체에 저장된 개수만 유효합니다. 이제 카운트가 값 자체로 저장되므로 zval과 해시테이블 키 간의 간접 액세스에 필요한 포인터 수가 줄어드는 등 zval이 아닌 구조적 데이터와 공유할 수 있습니다
<?php //php zval变量容器$a = 1;$b = 1;$c = &$a;$d = $b;$e = range(0, 3); xdebug_debug_zval('a'); xdebug_debug_zval('b'); xdebug_debug_zval('c'); xdebug_debug_zval('d'); xdebug_debug_zval('e'); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 结果如下 a:(refcount=2, is_ref=1)int 1b:(refcount=0, is_ref=0)int 1c:(refcount=2, is_ref=1)int 1d:(refcount=0, is_ref=0)int 1e:(refcount=1, is_ref=0)array (size=4) 0 => (refcount=0, is_ref=0)int 0 1 => (refcount=0, is_ref=0)int 1 2 => (refcount=0, is_ref=0)int 2 3 => (refcount=0, is_ref=0)int 3
# 🎜 🎜##🎜 🎜# 일반적인 변수는 더 이상 자신의 숫자를 기억하지 않습니다. . 가비지란 무엇인가기준 3에서만 GC는 zval을 수집한 다음 새로운 알고리즘을 사용하여 zval이 가비지인지 여부를 결정합니다. 그렇다면 그러한 변수가 진짜 쓰레기인지 어떻게 판단할 수 있을까요? 간단히 말하면 이 zval의 각 요소에 대해 refcount 빼기 1 연산을 수행하는 것입니다. 작업이 완료된 후 zval의 refcount가 0이면 이 zval은 쓰레기입니다#🎜 🎜## 🎜🎜#zval의 참조 횟수가 증가하면 zval은 여전히 사용 중이며 가비지가 아닙니다zval의 참조 횟수가 0으로 감소하면 zval이 해제될 수 있으며 는 쓰레기가 아닙니다#🎜🎜 #줄은 후 zval의 참조 횟수가 0보다 크면 zval을 해제할 수 없으며 zval이 쓰레기가 될 수 있습니다 # 🎜🎜## 🎜🎜## 🎜🎜 ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ###### 🎜🎜## 🎜🎜## 🎜🎜 ## 🎜🎜 #
위 내용은 PHP 가비지 수집 메커니즘 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!