> 백엔드 개발 > PHP 문제 > PHP가 메모리를 관리하는 방법

PHP가 메모리를 관리하는 방법

(*-*)浩
풀어 주다: 2023-02-24 14:26:01
원래의
1849명이 탐색했습니다.

메모리 관리에는 일반적으로 다음이 포함됩니다.

PHP가 메모리를 관리하는 방법

#🎜 🎜 #우리 프로그램이 사용할 충분한 메모리가 있습니까?

충분한 사용 가능한 메모리에서 메모리의 일부를 가져오는 방법

사용된 메모리의 경우 사용 가능 여부; 그리고 다른 프로그램에 재배포하여 사용하세요. (추천 학습:

입력부터 마스터까지의 PHP 프로그래밍)

이에 따라

PHP의 메모리 관리에도 이러한 내용이 포함되어 있지만 이러한 메모리는 ZEND에 있습니다. 커널은 외부에서 사용할 수 있도록 매크로 형태의 인터페이스로 제공됩니다.

후자의 두 연산은 각각 emalloc 매크로와 efree 매크로에 해당하며 첫 번째 연산은 emalloc 매크로가 반환한 결과를 기반으로 감지할 수 있습니다.

PHP의 메모리 관리는 계층적으로 볼 수 있습니다. 이는 스토리지 계층(storage), 힙 계층(heap) 및 인터페이스 계층(emaloc/efree)의 세 가지 계층으로 나뉩니다.

저장 계층은 실제로 malloc(), mmap() 등의 함수를 통해 시스템에서 메모리를 적용하고, free() 함수를 통해 요청된 메모리를 해제합니다. 저장 계층은 일반적으로 비교적 큰 메모리 블록에 적용됩니다. 여기서 적용되는 대용량 메모리는 저장 계층 구조에서 필요한 메모리를 의미하지 않습니다. 단지 힙 계층이 저장 계층의 할당 방법을 호출할 때 적용되는 것입니다. 메모리 및 저장 계층의 역할은 메모리 할당 방법을 힙 계층에 투명하게 만드는 것입니다.

사진과 같이 PHP 메모리 관리자입니다. PHP는 스토리지 계층에 4가지 메모리 할당 체계를 가지고 있습니다: malloc, win32, mmap_anon, mmap_zero. 기본적으로 malloc은 메모리 할당에 사용됩니다. ZEND_WIN32 매크로가 설정된 경우 Windows 버전이며 HeapAlloc이 메모리 할당을 위해 호출됩니다. 나머지 두 가지 메모리 구성표는 익명 메모리이며, PHP의 메모리 구성표는 환경 변수를 설정하여 수정할 수 있습니다.

PHP가 메모리를 관리하는 방법

PHP内存管理机制
var_dump(memory_get_usage());   //获取内存
$a = "laruence";                //定义一个变量
var_dump(memory_get_usage());   //定义变量之后获取内存
unset($a);                      //删除该变量
var_dump(memory_get_usage());   //删除变量后获取内存

从上面可以看出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());


从上面可以看出,虽然删除后内存变小了,但还是比没定义变量之前时大,这是因为虽然删除了变量的值,但变量名没有被删除。

php垃圾回收机制

PHP变量存储是存储在一个zval容器里面的

1.类型 2.值 3.is_ref 代表是否有地址引用 4.refcount 指向该值的变量数量

1.变量赋值的时候:is_ref为false  refcount为1

$a = 1;
xdebug_debug_zval(&#39;a&#39;);
echo PHP_EOL;

2.将变量a的值赋给变量b,变量b不会立刻去在内存中存储值,而是先指向变量a的值,一直到变量a有任何操作的时候

$b = $a;
xdebug_debug_zval(&#39;a&#39;);
echo PHP_EOL;

3.因为程序又操作了变量a,所以变量b会自己申请一块内存将值放进去。所以变量a的zavl容器中refcount会减1变为1,变量c指向a,所以refcount会加1变为2

$c = &$a;
xdebug_debug_zval(&#39;a&#39;);
echo PHP_EOL;
xdebug_debug_zval(&#39;b&#39;);
echo PHP_EOL;
로그인 후 복사

가비지 수집:
1 버전에서는 PHP It refcount 값을 기준으로 가비지 여부를 판단합니다

refcount 값이 0이면 PHP는 이를 가비지로 릴리스합니다

이 재활용 메커니즘에는 결함이 있습니다. 순환 참조를 재활용할 수 없습니다

2. 가비지 수집 메커니즘이 버전 5.3 이후 개선되었습니다

zval 컨테이너의 참조 횟수가 증가하는 것으로 확인되면 가비지 아님
#🎜🎜 #zval 컨테이너의 refcount가 감소하고 있는 것이 확인되어 0으로 줄어들면 바로 가비지 컬렉션으로 처리됩니다

그렇다면 zval 컨테이너의 refcount가 감소하고 있지만 0으로 감소하지 않은 것으로 확인되면 PHP는 해당 값을 가비지일 수 있는 의심되는 개체로 버퍼에 배치합니다.

버퍼가 임계 값에 도달하면 PHP는 자동으로 메소드를 호출하여 각 값을 순회하고 가비지인 것으로 확인되면 정리합니다

위 내용은 PHP가 메모리를 관리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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