이 기사의 내용은 PHP의 참조 분석 및 가비지 수집에 관한 것입니다. 필요한 친구가 참조할 수 있기를 바랍니다.
각 PHP 변수는 "zval"이라는 변수 컨테이너에 저장됩니다. zval 변수 컨테이너에는 변수의 유형과 값 외에 2바이트의 추가 정보가 포함되어 있습니다. 첫 번째는 "is_ref"로, 이 변수가 참조 세트에 속하는지 여부를 식별하는 데 사용되는 부울 값입니다. 이 바이트를 통해 PHP 엔진은 일반 변수와 참조 변수를 구별할 수 있습니다. PHP에서는 사용자가 &를 사용하여 사용자 정의 참조를 사용할 수 있으므로 zval 변수 컨테이너에는 메모리 사용을 최적화하는 내부 참조 계산 메커니즘도 있습니다. 두 번째 추가 바이트는 "refcount"이며, 이 zval 변수 컨테이너를 가리키는 변수(기호라고도 함)의 수를 나타내는 데 사용됩니다. 모든 기호는 기호 테이블에 존재하며, 각 기호에는 범위(scope)가 있고, 기본 스크립트(예: 브라우저를 통해 요청된 스크립트)와 각 함수나 메서드에도 범위가 있습니다.
//PHP의 개체는 참조로 전달됩니다
is_ref = 0, refcount = 0 스크립트 실행이 끝나면 zval 컨테이너가 삭제됩니다.
공식 예제 인용
<?php $a = array( 'one' ); $a[] =& $a; xdebug_debug_zval( 'a' );
a: (refcount=2, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=2, is_ref=1)=... )
unset$a 실행 중 변수는 zval과 관련된 메모리를 해제하지만 폐쇄 루프는 여전히 그 자체 내에 존재합니다
(refcount=1, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=1, is_ref=1)=... )
그러나 현재 컨테이너는 메모리 쓰레기가 되어 해제할 수 없습니다.
재활용 메커니즘: 간단히 말하면 스크립트를 실행한 후에도 여전히 존재하는 변수의 전체 데이터는 refcount -1이 됩니다. 0으로 감소하면 가비지로 판단되어 메모리 컨테이너가 파기됩니다.
관련 권장사항:
PHP의 가비지 수집 메커니즘은 쓰레기를 재활용할 수 있습니다. 어떤 쓰레기가 재활용될 수 없나요?
PHP 가비지 수집 메커니즘 - 참조 계산에 대한 기본 지식
위 내용은 PHP의 참조 및 가비지 수집 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!