메모리 관리에는 일반적으로 다음이 포함됩니다.
#🎜 🎜 #우리 프로그램이 사용할 충분한 메모리가 있습니까? 충분한 사용 가능한 메모리에서 메모리의 일부를 가져오는 방법 사용된 메모리의 경우 사용 가능 여부; 그리고 다른 프로그램에 재배포하여 사용하세요. (추천 학습:
입력부터 마스터까지의 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内存管理机制 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('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 버전에서는 PHP It refcount 값을 기준으로 가비지 여부를 판단합니다
refcount 값이 0이면 PHP는 이를 가비지로 릴리스합니다
이 재활용 메커니즘에는 결함이 있습니다. 순환 참조를 재활용할 수 없습니다
2. 가비지 수집 메커니즘이 버전 5.3 이후 개선되었습니다
zval 컨테이너의 참조 횟수가 증가하는 것으로 확인되면 가비지 아님
#🎜🎜 #zval 컨테이너의 refcount가 감소하고 있는 것이 확인되어 0으로 줄어들면 바로 가비지 컬렉션으로 처리됩니다
그렇다면 zval 컨테이너의 refcount가 감소하고 있지만 0으로 감소하지 않은 것으로 확인되면 PHP는 해당 값을 가비지일 수 있는 의심되는 개체로 버퍼에 배치합니다.
버퍼가 임계 값에 도달하면 PHP는 자동으로 메소드를 호출하여 각 값을 순회하고 가비지인 것으로 확인되면 정리합니다
위 내용은 PHP가 메모리를 관리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!