PHP 가비지 수집 메커니즘:
1 PHP는 주로 참조 카운팅을 사용하여 자동으로 메모리를 관리하고 불필요한 개체를 지울 수 있습니다.# ## #2. ref_count 및 is_ref는 zval 구조에 정의됩니다. ref_count는 이 zval이 참조되는 변수 수를 식별하는 참조 횟수입니다. is_ref는 참조
3을 강제하기 위해 & 주소 문자가 사용되는지 식별합니다. 순환 참조 메모리 누수 문제를 해결하기 위해 동기 주기 재활용 알고리즘이 사용됩니다.
예를 들어, 배열이나 객체가 주기적으로 자신을 참조하고 배열을 설정 해제하는 경우 참조 횟수가 -1 이후 0보다 크면 가비지 의심, 순회 및 시뮬레이션 삭제로 간주됩니다. refcount-1이 0이면 삭제하고 0이 아니면 완고한 쓰레기 생성 프로세스를 재개합니다:
a: (refcount_gc=1, is_ref_gc=0)='new string'
$a를 다른 변수에 할당할 때 $a에 해당하는 zval의 refcount_gc 1
이때, $a 및 $b 변수에 해당하는 내부 저장소 정보는 $a 및 $b 모두 "new string" 문자열을 가리키며, 그 내용은 다음과 같습니다. refcount는 2a,b가 됩니다: ( refcount_gc=2,is_ref=0)='new string'
$b 변수를 삭제하기 위해 unset을 사용하면 "new string"의 refcount_gc가 1씩 감소합니다. 그리고 1이 됩니다
'life', 'number' => 42); ?>
a: (refcount=1, is_ref=0)=array ( 'meaning' => (refcount=1, is_ref=0)='life', 'number' => (refcount=1, is_ref=0)=42 )
배열 변수 자체($a)는 실제로 엔진 내부의 해시 테이블입니다. 이 테이블에는 두 개의 zval 항목 의미와 숫자가 있으므로 실제로 총 3개의 zval이 있습니다. 이 세 개의 zval은 모두 변수의 참조 및 계산 원칙을 따르며 다이어그램으로 표시됩니다.
다음으로 요소를 $a에 추가하고 현재 요소를 추가합니다. 요소의 값은 새 요소에 할당됩니다:'life', 'number' => 42); $a['name'] = $a['meaning']; ?>
a: (refcount=1, is_ref=0)=array ( 'meaning' => (refcount=2, is_ref=0)='life', 'number' => (refcount=1, is_ref=0)=42, 'name' => (refcount=2, is_ref=0)='life' )
a: (refcount=2, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=2, is_ref=1)=… )
array 이 zval의 ref_count는 2이며 이는 순환 참조입니다. 이때 $a가 unset되면 $a가 심볼테이블에서 삭제되고 $a가 가리키는 zval의 refcount_gc가 1씩 줄어든다.
그러면 문제가 발생한다, $ a가 더 이상 기호 테이블에 없으면 사용자는 더 이상 이 변수에 액세스할 수 없지만 $a가 가리키는 zval의 refcount_gc는 0이 아닌 1이 되므로 재활용할 수 없으므로 메모리 누수가 발생합니다. 새로운 GC는 이러한 쓰레기를 정리하는 것입니다.
순환 참조 메모리 누수 문제를 해결하기 위해 동기식 순환 재활용 알고리즘을 사용합니다. ref_count가 1 감소하고 여전히 0보다 큰 경우 의심되는 가비지로 간주됩니다. 예를 들어 배열이나 객체가 주기적으로 자신을 참조하고 배열을 설정 해제하는 경우 refcount-1이 여전히 0보다 크면 refcount-1을 한 번 삭제하도록 순회 및 시뮬레이션됩니다. 0이면 삭제, 0이 아니면 복원. 더 많은 관련 콘텐츠를 보려면 PHP 중국어 웹사이트를 방문하세요:PHP 비디오 튜토리얼
위 내용은 예제를 통해 PHP 가비지 수집 메커니즘에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!