PHP의 가비지 수집 메커니즘에 대해 간략하게 설명합니다.

간략한 설명 : PHP의 변수는 변수 컨테이너 zval (c 구조)에 저장됩니다. 변수 유형과 값을 저장하는 것 외에도 zval에는 is_ref 및 refcount 필드가 있습니다. refcount는 변수를 가리키는 요소의 수를 나타내고 is_ref는 변수에 별칭이 있는지 여부를 나타냅니다. zval의 refcount가 증가하면 계속 사용되며 물론 쓰레기가 아닙니다. refcount가 0으로 감소하면 가변 컨테이너가 재활용되며 이는 쓰레기가 아닌 정상적인 릴리스입니다. zval의 refcount가 0이 아닌 값으로 감소하면 (여기에는 순환 참조 된 zval이 포함되어 있음) 쓰레기가 될 수 있으며 쓰레기 버퍼에 들어갑니다. 버퍼가 최대 값에 도달하면 복구 알고리즘이 zval을 반복하고 가비지인지 확인한 다음 해제합니다. 순환 참조로 인한 메모리 누수 문제를 해결하려면

 

메모리 누수 : 메모리 는 프로그램 실행 중 적용되지만 사용 완료 후 제 시간에 해제되지 않습니다.

 

순환 참조로 인한 메모리 누수 : 배열 또는 개체 내부 자식 요소가 부모 요소를 참조하고이 시점에 부모 요소가 삭제되면 해당 자식 요소가 여전히 변수 컨테이너를 가리키고 있기 때문에 변수 컨테이너가 삭제되지 않습니다. , refcount> 0이지만 변수 컨테이너를 가리키는 기호가 없기 때문에 수동으로 지울 수 없으므로 스크립트 실행이 끝날 때까지 메모리 누수가 발생합니다.

$a = array( 'one' );
$a[] = &$a;
unset($a);

 

가비지 수집 알고리즘 : 버퍼가 가득 차면 PHP는 버퍼의 모든 zval 순회를 "시뮬레이트"한 다음 "시뮬레이션 된 복구"또는 "정말 삭제"를 수행합니다. 그러나 PHP는 시뮬레이션 된 삭제 후에 refcount> 0으로 zval 만 복원하며, 복원되지 않은 zval, 즉 refcount = 0은 가비지이며 실제로 삭제됩니다. 시뮬레이션 된 삭제는 단순히이 zval의 각 요소에 대해 refcount 빼기 1 연산을 수행하는 것을 의미합니다. 연산이 완료된 후 zval의 refcount가 0이면이 zval은 가비지입니다. 시뮬레이션 된 복구는 시뮬레이션 된 삭제의 역 연산과 동일합니다.

추천

출처blog.csdn.net/weixin_38230961/article/details/106232073