PHP 메모리 관리 메커니즘
var_dump(memory_get_usage()); //获取内存 $a = "laruence"; //定义一个变量 var_dump(memory_get_usage()); //定义变量之后获取内存 unset($a); //删除该变量 var_dump(memory_get_usage()); //删除变量后获取内存
출력 결과:
int 262144 int 262144 int 262144
위에서 알 수 있듯이 PHP의 메모리 관리 메커니즘은 변수를 저장할 공간을 미리 주고, 공간이 부족할 경우 적용하는 것입니다. 새로운 하나의 공간을 위해.
1. 변수 이름을 저장하고 기호 테이블을 갖습니다.
2. 변수 값은 메모리 공간에 저장됩니다.
3. 변수 삭제 시 변수 값이 저장되어 있는 공간은 해제되지만, 변수 이름이 위치한 심볼 테이블은 줄어들지 않습니다.
var_dump(memory_get_usage()); //获取内存 //定义100个变量 for($i=0;$i<100;$i++) { $a = "test".$i; $$a = "hello"; } //获取定义100个变量之后的内存 var_dump(memory_get_usage()); //定义100个变量并删除 for($i=0;$i<100;$i++) { $a = "test".$i; unset($$a); } //获取删除之后的内存 var_dump(memory_get_usage());
출력 결과:
int 240040 int 257680 int 240856
위에서 알 수 있듯이 삭제 후 메모리는 작아지지만 변수를 정의하기 전보다는 여전히 커집니다. 변수 이름은 변경되지 않습니다.
php 가비지 수집 메커니즘
PHP 변수 저장소는 zval 컨테이너
1에 저장됩니다. 유형 2. 값 3. is_ref는 주소 참조가 있는지 여부를 나타냅니다. 4. refcount 값을 가리키는 변수의 수
1. 변수 할당 시기: is_ref가 false이고 refcount가 1
$a = 1; xdebug_debug_zval('a');echo PHP_EOL;
2. 변수 a의 값을 변수 b에 할당합니다. 변수 b는 값을 즉시 메모리에 저장하지 않지만 먼저 변수 a의 값을 가리킵니다. 변수 a
$b = $a; xdebug_debug_zval('a');echo PHP_EOL;
3. 프로그램이 변수 a를 다시 작동시키기 때문에 변수 b는 메모리 조각을 적용하고 그 안에 값을 넣습니다. 따라서 변수 a의 zavl 컨테이너에 있는 refcount는 1씩 감소하여 1이 됩니다. 변수 c는 a를 가리키므로 refcount는 1씩 증가하여 2
$c = &$a; xdebug_debug_zval('a');echo PHP_EOL; xdebug_debug_zval('b');echo PHP_EOL;
가비지 수집:
1이 됩니다. . 5.2 이전 버전에서는 PHP가 refcount 값을 기준으로 가비지 여부를 판단합니다.
refcount 값이 0이면 PHP는 이를 가비지로 해제합니다.
이 재활용 메커니즘에는 결함이 있으며 순환 참조가 있는 변수는 재활용할 수 없습니다.
2. 5.3 이후 버전 개선 가비지 수집 메커니즘
zval 컨테이너의 refcount가 증가하는 것으로 확인되면 이는 가비지가 아니라는 의미입니다.
zval 컨테이너의 refcount가 감소하는 것으로 확인되는 경우 0으로 줄어들면 바로 가비지 컬렉션으로 처리됩니다
zval 컨테이너의 refcount가 감소하는 것이 발견되면 refcount가 감소하고 있지만 0으로 줄어들지 않았습니다. PHP는 이 값을 다음과 같이 버퍼에 넣습니다. 쓰레기일 수도 있는 의심스러운 물체.
버퍼가 임계 값에 도달하면 PHP는 자동으로 각 값을 순회하는 메서드를 호출합니다. 가비지인 것으로 확인되면 정리하세요.
더 많은 관련 질문을 보려면 PHP 중국어 웹사이트를 방문하세요. PHP 실습 동영상 튜토리얼
위 내용은 PHP 메모리 관리 메커니즘과 가비지 수집 메커니즘은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!