>백엔드 개발 >PHP 튜토리얼 >PHP 메모리 릴리스 및 가비지 컬렉션 분석

PHP 메모리 릴리스 및 가비지 컬렉션 분석

不言
不言원래의
2018-06-19 17:30:221794검색

이 기사에서는 PHP로 프로그램을 작성하는 방법과 메모리 릴리스 및 가비지 수집과 관련된 문제를 공유합니다. 관심 있는 친구들이 이 기사에서 배울 수 있습니다.

참조 할당

$a = 'apple';
$b = &$a;

위 코드에서는 변수 a에 문자열을 할당한 다음 변수 b에 a의 참조를 할당했습니다. 분명히 이 시점을 가리키는 메모리는 다음과 같아야 합니다:

$a -> &#39;apple&#39; <- $b

a와 b는 동일한 메모리 영역을 가리킵니다. 우리는 string(5) "apple" string(5를 통해 var_dump($a, $b)을 얻습니다. ) ) "apple" , 이는 우리가 예상했던 것입니다.

unset function

문자열 'apple'을 메모리에서 해제하고 싶다고 가정해 보겠습니다.

unset($a);

그러나 $a $b 두 변수의 정보를 다시 인쇄하여 다음 결과를 얻었습니다. 주의 사항: 정의되지 않은 변수: a 및 string(5) "apple" . 이상하게도 $a와 $b는 모두 메모리 영역을 가리키고 있으며 $a는 분명히 해제되었습니다. 왜 $b는 여전히 'apple'입니까?

실제로는 다음과 같습니다. unset()은 변수 포인터를 파괴하고 해당 메모리 영역에 저장된 문자열을 해제하지 않습니다. 따라서 작업이 완료된 후 메모리 포인터는 다음과 같습니다.

&#39;apple&#39; <- $b

기억해야 할 중요한 점: unset()은 변수가 가리키는 메모리를 해제하지 않고 변수 포인터만 파괴합니다. 동시에 해당 메모리 조각의 참조 횟수를 1씩 줄입니다. 참조 횟수가 0이면, 즉 해당 메모리 조각이 어떤 변수에서도 참조되지 않으면 PHP의 가비지 수집이 트리거됩니다.

직접 재활용

그럼 '사과'가 차지한 메모리를 실제로 해제하려면 어떻게 해야 할까요?

위의 방법을 사용하면 설정을 해제($a)한 다음 설정을 해제($b)하여 메모리 영역의 모든 참조를 삭제할 수 있습니다. 참조 횟수가 0으로 줄어들면 PHP에서 자연스럽게 재활용됩니다.

물론 더 직접적인 방법도 있습니다:

$a = null;

null에 직접 할당하면 $a가 가리키는 메모리 영역이 비워지고 참조 카운트가 0으로 재설정되며 메모리가 해제됩니다.

스크립트 실행 종료

php는 스크립트 실행이 끝나면 스크립트에 사용된 모든 메모리가 해제되는 스크립트 언어입니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!

관련 권장사항:

PHP의 move_uploaded_file() 함수 분석에 대해

PHP 디버깅에서 var_export, print_r 및 var_dump의 차이점에 대해

위 내용은 PHP 메모리 릴리스 및 가비지 컬렉션 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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