>백엔드 개발 >PHP 튜토리얼 >예제를 통해 PHP 가비지 수집 메커니즘에 대한 자세한 설명

예제를 통해 PHP 가비지 수집 메커니즘에 대한 자세한 설명

王林
王林앞으로
2019-08-29 13:55:312992검색

PHP 가비지 수집 메커니즘

1 PHP는 주로 참조 카운팅을 사용하여 자동으로 메모리를 관리하고 불필요한 개체를 지울 수 있습니다.# 🎜🎜## 🎜🎜#2. ref_count 및 is_ref는 zval 구조에 정의됩니다. ref_count는 이 zval이 참조되는 변수 수를 식별하는 참조 횟수입니다. is_ref는 참조

3을 강제하기 위해 & 주소 문자가 사용되는지 식별합니다. 순환 참조 메모리 누수 문제를 해결하기 위해 동기 주기 재활용 알고리즘이 사용됩니다.

예를 들어, 배열이나 객체가 주기적으로 자신을 참조하고 배열을 설정 해제하는 경우 참조 횟수가 -1 이후 0보다 크면 가비지 의심, 순회 및 시뮬레이션 삭제로 간주됩니다. refcount-1이 0이면 삭제하고 0이 아니면 완고한 쓰레기 생성 프로세스를 재개합니다:

<?php
    $a = "new string";
?>
a: (refcount_gc=1, is_ref_gc=0)=&#39;new string&#39;

$a를 다른 변수에 할당할 때 $a에 해당하는 zval의 refcount_gc 1

<?php
    $a = "new string";
    $b = $a;
?>

이때, $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이 됩니다

#🎜🎜 #일반 변수의 경우 이는 모두 정상이지만 복합 유형 변수(배열 및 개체)에서는 더 흥미로운 일이 발생합니다.

<?php
    $a = array(&#39;meaning&#39; => &#39;life&#39;, &#39;number&#39; => 42);
?>

$a내부 저장 정보는 다음과 같습니다. #🎜 🎜#
a: (refcount=1, is_ref=0)=array (
&#39;meaning&#39; => (refcount=1, is_ref=0)=&#39;life&#39;,
&#39;number&#39; => (refcount=1, is_ref=0)=42
)

배열 변수 자체($a)는 실제로 엔진 내부의 해시 테이블입니다. 이 테이블에는 두 개의 zval 항목 의미와 숫자가 있으므로 실제로 총 3개의 zval이 있습니다. 이 세 개의 zval은 모두 변수의 참조 및 계산 원칙을 따르며 다이어그램으로 표시됩니다.

다음으로 요소를 $a에 추가하고 현재 요소를 추가합니다. 요소의 값은 새 요소에 할당됩니다:

<?php
    $a = array(&#39;meaning&#39; => &#39;life&#39;, &#39;number&#39; => 42);
    $a[&#39;name&#39;] = $a[&#39;meaning&#39;];
 ?>
예제를 통해 PHP 가비지 수집 메커니즘에 대한 자세한 설명그런 다음 $a의 내부 저장소는 "life"의 ref_count가 2가 되고 ref_count는 of 42 is 1:

a: (refcount=1, is_ref=0)=array (
&#39;meaning&#39; => (refcount=2, is_ref=0)=&#39;life&#39;,
&#39;number&#39; => (refcount=1, is_ref=0)=42,
&#39;name&#39; => (refcount=2, is_ref=0)=&#39;life&#39;
)
# 🎜🎜#배열의 요소에 배열 참조를 할당하면 흥미로운 일이 발생합니다.

<?php
    $a = array(&#39;one&#39;);
    $a[] = &$a;
?>

이런 방식으로 $a 배열은 두 요소 중 하나는 인덱스 0이고 값은 1이고, 다른 인덱스는 1입니다. 이는 $a 자체에 대한 참조입니다.

a: (refcount=2, is_ref=1)=array (
0 => (refcount=1, is_ref=0)=&#39;one&#39;,
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는 이러한 쓰레기를 정리하는 것입니다. 예제를 통해 PHP 가비지 수집 메커니즘에 대한 자세한 설명

순환 참조 메모리 누수 문제를 해결하기 위해 동기식 순환 재활용 알고리즘을 사용합니다. ref_count가 1 감소하고 여전히 0보다 큰 경우 의심되는 가비지로 간주됩니다.

예를 들어 배열이나 객체가 주기적으로 자신을 참조하고 배열을 설정 해제하는 경우 refcount-1이 여전히 0보다 크면 refcount-1을 한 번 삭제하도록 순회 및 시뮬레이션됩니다. 0이면 삭제, 0이 아니면 복원.

더 많은 관련 콘텐츠를 보려면 PHP 중국어 웹사이트를 방문하세요:

PHP 비디오 튜토리얼

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

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제