>백엔드 개발 >PHP 튜토리얼 >PHP 가비지 수집 메커니즘의 이해

PHP 가비지 수집 메커니즘의 이해

巴扎黑
巴扎黑원래의
2018-05-16 10:39:165503검색

[소개] PHP 가비지 수집 메커니즘은 php5 이후에만 사용할 수 있습니다. 이제 모든 학생들에게 도움이 되기를 바랍니다. PHP 5와 3 이전에 사용된 가비지 수집 메커니즘은 간단한 참조 카운트, 즉 각 메모리 객체에 카운트가 할당되었습니다.

PHP 가비지 수집 메커니즘은 php5 이후에만 나온 것입니다. 모든 학생들에게 도움이 되기를 바랍니다.

PHP 5.3 이전에 사용된 가비지 수집 메커니즘은 간단한 "참조 계산"입니다. 즉, 각 메모리 객체에 카운터가 할당됩니다. 변수 참조가 제거되고 카운터가 -1이 됩니다. 카운터 = 0이면 메모리 개체가 사용되지 않고 메모리 개체가 삭제되며 가비지 수집이 완료되었음을 나타냅니다.

"참조 카운팅"에 문제가 있습니다. 즉, 두 개 이상의 개체가 서로 참조하여 링을 형성하는 경우 이때 메모리 개체의 카운터가 0으로 줄어들지 않습니다. 이 메모리 개체 그룹은 더 이상 유용하지 않지만 재활용할 수 없으므로 메모리 누수가 발생합니다.

php5.3부터 참조 계산을 기반으로 하는 새로운 가비지 수집 메커니즘이 사용됩니다. 메모리 누수를 방지하기 위한 링의 존재를 감지합니다.

이 알고리즘에 대해서는 이 짧은 요약의 주요 참고 자료인 다음 기사를 참조할 수 있습니다.): PHP5의 가비지 컬렉션 알고리즘(가비지 컬렉션)의 진화에 대한 간략한 논의

아래 예

예 1: gc.php

<?php 
error_reporting(E_ALL); 
$a = &#39;I am test.&#39;; 
$b = & $a;
echo $b ."n"; 
?>

말할 필요도 없이 % php -f gc.php 출력 결과는 매우 명확합니다.

hy0kl% php -f gc.php 
I am test.

자, 다음:
예 2:

<?php 
error_reporting(E_ALL); 
$a = &#39;I am test.&#39;; 
$b = & $a;
$b = &#39;I will change?&#39;;                                                         
echo $a ."n"; 
echo $b ."n"; 
?>
执行结果依然很明显:
hy0kl% php -f gc.php 
I will change?
I will change?

한 번 살펴보세요:
예 3:

<?php 
error_reporting(E_ALL); 
$a = &#39;I am test.&#39;; 
$b = & $a; 
unset($a);
echo $a ."n"; 
echo $b ."n";
?>

생각해볼 필요가 있나요?

hy0kl% php -f gc.php 
Notice: Undefined variable: a in /usr/local/www/apache22/data/test/gc.php on line 8
I am test.

조금 헷갈리시나요?

다시 보세요:
예 4:

<?php 
error_reporting(E_ALL); 
$a = &#39;I am test.&#39;; 
$b = & $a;
unset($b);                                                                     
echo $a ."n"; 
echo $b ."n";
?>

사실 예 3을 이해하시면 이겁니다. 예시 3과 동일합니다.

hy0kl% php -f gc.php 
I am test.
Notice: Undefined variable: b in /usr/local/www/apache22/data/test/gc.php on line 9

보세요:
예시 5:

<?php error_reporting(E_ALL); 
$a = &#39;I am test.&#39;; 
$b = & $a;
$a = null;echo &#39;$a = &#39;. $a ."n"; 
echo &#39;$b = &#39;. $b ."n"; 
?>

처음 느껴지는 치열함은 무엇인가요?

hy0kl% php -f gc.php 
$a = 
$b =

네, 이것이 출력 결과입니다. 맞습니다. 이미 PHP GC에 대해 깊이 이해하고 있는 PHP GC 사람들은 솔직히 이 코드를 처음 실행했을 때 이상하게 생각하지 않을 것입니다. PHP GC에 대한 더 깊은 이해는 다음과 같이 작동합니다.

예제 6:

<?php                                                                         
error_reporting(E_ALL); 
$a = &#39;I am test.&#39;; 
$b = & $a;
$b = null;
echo &#39;$a = &#39;. $a ."n"; 
echo &#39;$b = &#39;. $b ."n"; 
?>

위는 PHP 가비지 수집에 대한 이해입니다. 메커니즘에 대한 자세한 내용은 PHP 중국어 웹사이트(www.php.cn)를 참고하세요!

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