가비지 수집 PHP 가비지 수집 메커니즘에 대한 간략한 설명

WBOY
풀어 주다: 2016-07-29 08:43:21
원래의
1158명이 탐색했습니다.

저도 PHP를 배우는 사람이지만 이전에는 PHP 내부의 가비지 수집 프로세스에 대해 잘 몰랐습니다. 메모리 오버플로를 방지하기 위해 코드에서 unset, null, mysql_close, __destruct 및 기타 함수를 사용하여 객체를 해제했습니다. 나는 인터넷의 GG에서 다음 지침을 찾아 기록했습니다. "PHP는 자동으로 메모리를 관리하고 더 이상 필요하지 않은 개체를 지울 수 있습니다. PHP는 참조 카운팅이라는 간단한 가비지 수집 메커니즘을 사용합니다. 각 개체에 참조 카운터가 포함될 때마다 그리고 각 참조는 개체에 연결됩니다. 참조가 생활 공간을 벗어나거나 NULL로 설정되면 카운터는 1씩 감소합니다. 개체의 참조 카운터가 0이 되면 PHP는 이 개체가 더 이상 존재하지 않는다는 것을 알게 됩니다. 필요하고 그것이 차지하는 메모리 공간이 해제됩니다.”
우리 모두 알고 있듯이 PHP 엔진 자체는 C로 작성되었습니다. C를 언급할 때 GC(가비지 수집)를 언급해야 합니다. PHP 매뉴얼을 통해 PHP 엔진이 자동으로 GC 작업을 수행한다는 것을 알고 있습니다. 질문하지 않을 수 없습니다. & 참조 작업이 포인터입니까? unset()을 사용하여 변수를 설정하면 실제로 재활용됩니까? 주의 깊게 분석해 보면 그것이 단순하고 일반적이지 않다는 것을 알게 될 것입니다. 아마도 누군가는 PHP 소스 코드를 보면 알 수 있을 것입니다. 이 문제는 반드시 해결될 것입니다.그러나 이 글에서는 PHP 자체의 평범해 보이는 부분만 분석할 것입니다. 물론, 제한된 수준으로 인해 누락된 부분도 있을 수 있습니다. .
우선 가장 간단한 실행 프로세스인 예를 살펴보겠습니다.
예제 1: gc.php
error_reporting(E_ALL)
$a = 'I am test.'; $b = & $a;
echo $b . "
?> 말할 것도 없이 % php -f gc.php 출력 결과는 매우 명확합니다. :
hy0kl% php -f gc.php
테스트 중입니다.
알겠습니다. 다음 A:
예 2:
error_reporting(E_ALL); >$a = '나는 테스트입니다.';
$b = & $a
$ b = '변경할까요?'
echo $a ." "
echo $b ." ";
?>
실행 결과는 여전히 확실합니다:
hy0kl% php -f gc.php
바꿀까요?
보시죠? :
예 3:
error_reporting(E_ALL);
$a = '나는 테스트입니다.'
$b = & $a
unset( $a);
echo $a ." ";
echo $b ." "
생각해볼 필요가 있나요?
hy0kl% php -f gc .php
주의: 정의되지 않은 변수: a in /usr/local/www/apache22/data/test/ gc.php 8행
저는 테스트입니다.
조금 혼란스럽습니까? 다시 보세요:
예 4:
error_reporting(E_ALL)
$a = '나는 테스트입니다.'
$b = & $a; unset($b);
echo $a ." ";
echo $b ." "
?> 사실 예제 3을 이해하면 이와 비슷합니다.
hy0kl% php -f gc.php
저는 테스트입니다.
주의: 정의되지 않은 변수: b in /usr/local/www/apache22/data/test/gc.php 9행
보세요:
예 5:
error_reporting(E_ALL)
$a = '나는 테스트입니다.'
$b = & $a; a = null;
echo '$a = '.$a ."
echo ' $b = '. $b ."
?>
hy0kl% php -f gc.php
$a =
$b =
예, PHP GC에 대해 깊이 이해하고 있는 PHPer는 찾지 못할 결과입니다. 이상합니다. 솔직히 말해서 이 코드를 처음 실행했을 때 놀랐지만 이제 PHP GC에 대해 더 깊이 이해했으므로 이를 사용하는 다음 예제를 이해하기가 더 쉬울 것입니다. 🎜>예 6:
error_reporting(E_ALL);
$a = '나는 테스트입니다.'
$b = & $a
$b; ;
echo '$a = '.$a ." ";
echo '$b = '.$b ." "
그렇다면, 예제에 자세한 내용이 없으면 이 창을 닫으시면 됩니다.
GC와 참조를 자세히 분석해 보겠습니다.
1. 간단히 말해서, 이 프로세스는 메모리에 공간을 열고 그 안에 테스트 중인 문자열을 저장하는 것입니다. 이때 참조되는 각 블록의 참조 횟수를 기록하는 기호 테이블이 있습니다. 이 메모리 블록의 개수는 1만큼 증가하고 $a라는 레이블(변수)이 이 메모리 블록을 가리키는 데 사용됩니다. 이는 메모리를 작동하기 위한 레이블 지정에 편리합니다. 변수 $a에 대한 연산. $a가 가리키는 메모리를 찾고, $b에 대해 동일한 참조 지점을 설정하고, 테스트 중인 문자열을 저장하는 것으로 이해됩니다. 1. 즉, 이 라인에 대해 스크립트가 실행되면 I am test. 문자열을 저장하는 메모리 블록이 두 번 참조됩니다. 여기서 강조해야 할 점은 & 연산이 포인터 대신 참조점이 설정된다는 것입니다. PHP에는 포인터 개념이 없습니다. 동시에 일부 사람들은 파일 소프트 링크가 UNIX와 유사하다고 제안했습니다. 이는 어느 정도 이해할 수 있습니다. 즉, 제가 테스트하는 문자를 저장하는 메모리 조각입니다. 실제 파일과 변수 $a 및 $b는 실제 파일에 대해 설정된 소프트 링크이지만 동일한 실제 파일을 가리키므로 예제 2에서 $b에 값이 할당되면 $a의 값이 또한 특정 소프트 링크를 통해 파일을 조작하는 것과 유사합니다.
3. 실제 실행 결과에 따르면 unset() 작업이 수행되는 것을 볼 수 있습니다. )만 인터럽트 원래 가리킨 메모리에 대한 이 변수의 참조를 열어 변수 자체를 정의되지 않은 널 참조로 만듭니다. 호출이 이루어지면 알림이 발행되고 기호 테이블에 있는 해당 메모리의 참조 카운트는 1씩 감소합니다. 이 변수를 가리키는 다른 지점에는 영향을 미치지 않습니다. 즉, 기호 테이블에 있는 메모리 블록의 참조 횟수가 0인 경우에만 PHP 엔진이 이 메모리 블록을 회수합니다. PHP 매뉴얼
4.0.0 unset()은 표현식이 되었습니다. (PHP 3에서는 unset()이 항상 1을 반환합니다.)
이것이 무엇을 의미하나요?
다음 코드와 그 결과를 살펴보세요. 🎜>error_reporting(E_ALL);
$a = '테스트 중입니다.'
$b = & $a
unset($a); ($a);
echo '$a = '.$a ."
echo '$b ." "; >
hy0kl% php -f gc.php
주의 사항: 정의되지 않은 변수: a in /usr/local/www/apache22/data/test/gc.php 10행
$a =
$b =
첫 번째 unset( ) 작업입니다. 포인터 연결이 끊어졌으므로 후속 작업은 기호 테이블의 모든 메모리 참조 횟수에 영향을 미치지 않습니다.
4. 예제 5 및 6을 통해 null 할당 작업이 매우 폭력적이라는 결론을 내릴 수 있습니다. 변수가 가리키는 메모리의 심볼 번호에 있는 참조 카운트를 0으로 설정합니다. 그러면 이 메모리는 엔진에 의해 자연스럽게 재활용됩니다. 언제 다시 사용될지는 알 수 없습니다. 즉시 다른 파일을 저장하는 데 사용될 수 있습니다. 정보는 다시 사용되지 않을 수 있습니다. 그러나 어떤 경우에도 해당 메모리를 가리키는 모든 원래 변수는 회수된 메모리에서 더 이상 작동할 수 없으며 이를 호출하려는 모든 변수는
error_reporting(E_ALL);
$a = '나는 테스트입니다.'
$b = & $a;
$b =
echo '$a = '. $ a ." ";
echo '$b = '.$b ." "
if (null === $a)
{
echo '$a는 null입니다.';
} else
{
echo '$a 유형을 알 수 없습니다.'
}
?>
hy0kl% php -f gc.php
$a =
$b =
$a는 null입니다.
요약하자면, 오픈 소스 제품의 소스 코드를 볼 때 상대적으로 큰 임시 변수가 자주 표시되거나 그렇지 않은 이유를 충분히 설명합니다. 호출된 재사용 정보는 집중되거나 표시되며 null 값이 할당됩니다. 이는 UNIX에서 실제 파일을 직접 종료하는 것과 동일하며 이를 가리키는 모든 소프트 링크는 자연스럽게 빈 링크가 됩니다.

위 내용은 가비지 컬렉션에 대한 소개입니다. 가비지 컬렉션의 내용을 포함한 PHP 가비지 컬렉션 메커니즘에 대한 간략한 설명이 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!