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

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

巴扎黑
풀어 주다: 2023-03-03 12:52:01
원래의
5517명이 탐색했습니다.

[소개] 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 중국어 웹사이트(m.sbmmt.com)를 참고하세요!

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