>백엔드 개발 >PHP 튜토리얼 >PHP 가비지 수집 메커니즘이란 무엇입니까? PHP 가비지 수집 메커니즘에 대한 자세한 설명

PHP 가비지 수집 메커니즘이란 무엇입니까? PHP 가비지 수집 메커니즘에 대한 자세한 설명

云罗郡主
云罗郡主원래의
2019-01-21 14:49:533923검색

PHP의 가비지 수집 메커니즘은 참조 카운팅 및 쓰기 시 복사 COW 메커니즘으로 간단히 요약할 수 있습니다.

이 기사는 주로 PHP 가비지 수집 메커니즘을 숙지하는 지식을 여러분과 공유합니다. 이것이 모든 사람에게 도움이 되기를 바랍니다. [추천 튜토리얼: php 튜토리얼]

참조 카운팅에 대한 기본 지식

공식 홈페이지의 답변은 다음과 같습니다. 각 PHP 변수는 "zval"이라는 변수 컨테이너에 존재합니다. 변수의 유형 및 값에는 2바이트의 추가 정보도 포함됩니다. is_ref 및 refcount is_ref는 이 변수가 참조 세트(참조 세트)에 속하는지 식별하는 데 사용되는 부울 값입니다. PHP 엔진은 이 바이트를 통해 일반 변수와 참조 변수를 구분할 수 있습니다. PHP5에서는 zval 변수 컨테이너를 가리키는 변수의 개수를 나타내는 데 Refcount가 사용됩니다. )이 할당되면(몇 가지 예외가 있음), 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(&#39;a&#39;);
xdebug_debug_zval(&#39;b&#39;);
xdebug_debug_zval(&#39;c&#39;);
xdebug_debug_zval(&#39;d&#39;);
xdebug_debug_zval(&#39;e&#39;); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

결과는 다음과 같습니다

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), 배열 (크기=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

<?php
//php zval变量容器
$a = 1;
$b = 1;
$c = &$a;
$d = $b;
$e = range(0, 3);
xdebug_debug_zval(&#39;a&#39;);
xdebug_debug_zval(&#39;b&#39;);
xdebug_debug_zval(&#39;c&#39;);
xdebug_debug_zval(&#39;d&#39;);
xdebug_debug_zval(&#39;e&#39;); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

결과는 다음과 같습니다. 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) 배열 (크기=4) 0 => (refcount=0, is_ref=0)int 0 1 => )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의 refcount가 증가하면 이는 가비지입니다. zval은 여전히 ​​사용 중입니다. zval의 refcount가 0으로 감소하면 zval이 0보다 크게 감소하면 zval이 해제될 수 없습니다. zval은 쓰레기가 될 수 있습니다.

위 내용은 PHP 가비지 수집 메커니즘이란 무엇입니까? PHP 가비지 수집 메커니즘에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.