>  기사  >  백엔드 개발  >  unset이 PHP에서 메모리를 해제하면 어떻게 되나요?

unset이 PHP에서 메모리를 해제하면 어떻게 되나요?

伊谢尔伦
伊谢尔伦원래의
2017-06-24 09:54:181867검색

먼저 PHP 릴리스 메모리에서 설정이 해제됩니까?

먼저 예를 살펴보겠습니다.

var_dump(memory_get_usage());
$a = "laruence";
var_dump(memory_get_usage());
unset($a);
var_dump(memory_get_usage());

출력(다른 개인용 컴퓨터에서는 시스템, PHP 버전 및 로드된 확장 프로그램에 따라 다를 수 있음) 서로 다름):

int(90440)
int(90640)
int(90472

알아차림 90472-90440=32이므로 다양한 결론이 나옵니다. 어떤 사람들은 PHP의 unset이 실제로 메모리를 해제하지 않는다고 하고, 어떤 사람들은 PHP의 unset만 메모리만 정말 무료일 것이라고 말합니다. 큰 변수(많은 수의 문자열, 큰 배열)이 릴리스되면 어떤 사람들은 PHP 수준에서 메모리를 논의하는 것이 의미가 없다고 말하기도 합니다.

그러면 이 32 바이트는 어디로 갔을까요?
이 질문에 대답하기 위해 저는 두 가지 측면에서 시작하겠습니다:
이 32바이트는 어디로 갔습니까?
우선 생각을 깨야 합니다. PHP는 C 언어와는 다릅니다. 메모리 할당은 호출을 통해서만 발생합니다.
즉, PHP에는 우리가 볼 수 없는 메모리 할당 프로세스가 많이 있습니다.
예를 들면 다음과 같습니다.

$a = "laruence";

암시적 메모리 할당 지점은 다음과 같습니다.
1. 변수에 메모리를 할당합니다. 이름을 지정하고 심볼 테이블에 저장합니다
2. 변수 값에 메모리를 할당합니다
그러니 겉모습만 보지 마세요.
둘째,PHP의 unset이 실제로 메모리를 해제할 것이라는 점을 의심하지 마세요(물론) , 또한 참조와 계산을 결합하려면 PHP 원리(변수 분리/참조)에 대한 심층적인 이해를 위해 이전 기사를 참조하십시오. 그러나 이번 릴리스는 C 프로그래밍 의미의 릴리스가 아니며 다시 전달되지 않습니다.
PHP의 경우 메모리 할당을 위해 C 언어와 유사한 메모리 관리 API 세트를 제공합니다. 이러한 API는 PHP에서 이러한 API를 통해 내부적으로 관리됩니다. emalloc은 메모리를 신청하는데, PHP는 단순히 OS에 메모리를 요청하는 것이 아니라, OS에 큰 메모리 블록을 요청한 후, 이런 방식으로 메모리를 신청하는 로직이 있을 때 그 일부를 신청자에게 할당합니다. , OS에 메모리를 요청할 필요가 없습니다. 메모리를 적용하고 빈번한 시스템 호출을 피하세요.

예를 들어 다음 예는

출력:

int(262144)
int(262144)
int(262144
즉, 변수를 정의할 때

$a, PHP는 시스템에서 새 메모리를 적용하지 않습니다.

마찬가지로 efree를 호출하여 메모리를 해제하면 PHP는 메모리를 OS에 반환하지 않고 이 메모리를 유지 관리하는 여유 메모리 목록에 추가합니다. 메모리 캐시 목록에 넣을 가능성이 더 높습니다(포스트스크립트, 제가 확인한 PHP5.2.4, 5.2.6, 5.2.8과 같은 일부 PHP 버전은 호출할 때 줄어들지 않습니다). get_memory_usage() 메모리 캐시 목록에서 사용 가능한 메모리 블록 크기로 이동하면 설정 해제 후에도 메모리가 변경되지 않은 것처럼 보입니다.

이제 방금 말했듯이 많은 메모리가 어디로 갔는지 답해 보겠습니다. 할당 프로세스는 명시적이지 않습니다.

다음 코드를 읽으면 이해할 수 있습니다.

출력: 

string(43) "I am php.cn"
int(90808) //赋值前
int(90976)
int(90808) //是的, 内存正常释放
90808-90808 = 0, 즉, 이 32바이트는 출력 함수 점유(엄밀히 말하면 출력 헤더에 의해 점유됨)

증가만 하고 감소하지 않는 배열


Hashtable은 PHP의 핵심 구조입니다. (Hashtable을 이해하려면 내 이전 기사를 참조하세요. -PHP 배열(순회 순서)에 대한 심층적인 이해, 배열도 그녀로 표현되며 기호 테이블도 연관 배열입니다. 다음 코드의 경우:

코드 복사

코드는 다음과 같습니다.

    var_dump("I am www.php.cn");
    var_dump(memory_get_usage());
    $array = array_fill(1, 100, "laruence");
    foreach ($array as $key => $value) {
        ${$value . $key} = NULL;
    }
    var_dump(memory_get_usage());
    foreach ($array as $key=> $value) {
        unset(${$value . $key});
    }
    var_dump(memory_get_usage());
100개의 변수를 정의한 다음 Unset을 눌렀습니다. 출력을 살펴보겠습니다.

     string(43) "I am php.cn"
    int(93560)
    int(118848)
    int(104448


와, 왜 이렇게 메모리가 적나요?

이것은 Hashtable의 경우 정의할 때 불가능하기 때문입니다. 알 수 없는 개인을 저장하기 위해 한 번에 충분한 메모리 블록을 할당하므로 PHP는 초기화 중에 메모리 블록의 작은 부분만 HashTable에 할당한 다음 충분하지 않을 때 용량을 확장하기 위해 크기를 조정합니다. 반면, Hashtable은 확장만 가능하고 축소는 불가능합니다. 위의 예에서는 100개의 변수를 저장했을 때 심볼 테이블이 부족하여 이 100개의 변수를 차례로 해제하면 메모리가 부족해집니다. 변수가 차지했던 메모리가 해제됐는데(118848~104448) 심볼 테이블이 줄어들지 않아서 심볼 테이블 자체가 차지하는 메모리가 적어지네요...
이제 PHP의 메모리 관리에 대한 사전 이해가 되셨나요? ?

위 내용은 unset이 PHP에서 메모리를 해제하면 어떻게 되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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