>  기사  >  백엔드 개발  >  PHP의 참조 및 가비지 수집 분석

PHP의 참조 및 가비지 수집 분석

不言
不言원래의
2018-09-04 17:43:591303검색

이 기사의 내용은 PHP의 참조 분석 및 가비지 수집에 관한 것입니다. 필요한 친구가 참조할 수 있기를 바랍니다.

각 PHP 변수는 "zval"이라는 변수 컨테이너에 저장됩니다. zval 변수 컨테이너에는 변수의 유형과 값 외에 2바이트의 추가 정보가 포함되어 있습니다. 첫 번째는 "is_ref"로, 이 변수가 참조 세트에 속하는지 여부를 식별하는 데 사용되는 부울 값입니다. 이 바이트를 통해 PHP 엔진은 일반 변수와 참조 변수를 구별할 수 있습니다. PHP에서는 사용자가 &를 사용하여 사용자 정의 참조를 사용할 수 있으므로 zval 변수 컨테이너에는 메모리 사용을 최적화하는 내부 참조 계산 메커니즘도 있습니다. 두 번째 추가 바이트는 "refcount"이며, 이 zval 변수 컨테이너를 가리키는 변수(기호라고도 함)의 수를 나타내는 데 사용됩니다. 모든 기호는 기호 테이블에 존재하며, 각 기호에는 범위(scope)가 있고, 기본 스크립트(예: 브라우저를 통해 요청된 스크립트)와 각 함수나 메서드에도 범위가 있습니다.

//PHP의 개체는 참조로 전달됩니다

is_ref = 0, refcount = 0 스크립트 실행이 끝나면 zval 컨테이너가 삭제됩니다.

공식 예제 인용

<?php
$a = array( &#39;one&#39; );
$a[] =& $a;
xdebug_debug_zval( &#39;a&#39; );
a: (refcount=2, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)='one',
   1 => (refcount=2, is_ref=1)=...
)

自引用(curcular reference,自己是自己的一个元素)的数组的zval

unset$a 실행 중 변수는 zval과 관련된 메모리를 해제하지만 폐쇄 루프는 여전히 그 자체 내에 존재합니다

(refcount=1, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)=&#39;one&#39;,
   1 => (refcount=1, is_ref=1)=...
)

Zvals after removal of array with a circular reference demonstrating the memory leak

그러나 현재 컨테이너는 메모리 쓰레기가 되어 해제할 수 없습니다.

재활용 메커니즘: 간단히 말하면 스크립트를 실행한 후에도 여전히 존재하는 변수의 전체 데이터는 refcount -1이 됩니다. 0으로 감소하면 가비지로 판단되어 메모리 컨테이너가 파기됩니다.

관련 권장사항:

PHP의 가비지 수집 메커니즘은 쓰레기를 재활용할 수 있습니다. 어떤 쓰레기가 재활용될 수 없나요?

PHP 가비지 수집 메커니즘 - 참조 계산에 대한 기본 지식

위 내용은 PHP의 참조 및 가비지 수집 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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