>  기사  >  백엔드 개발  >  PHP 가비지 수집 메커니즘이란 무엇입니까?

PHP 가비지 수집 메커니즘이란 무엇입니까?

一个新手
一个新手원래의
2017-09-13 10:00:201562검색

 가비지 수집 메커니즘을 구현하는 전체 이유는 순환 참조 변수를 정리하여 메모리 공간을 절약하는 것입니다.

  1. Reference Count: php 변수는 "zval"이라는 변수 컨테이너에 저장됩니다. zval 변수 컨테이너에는 변수의 유형 및 값 외에도 is_ref 및 refcount라는 2바이트의 추가 정보가 포함됩니다. is_ref는 이 변수가 참조 컬렉션에 속하는지 여부를 식별하는 데 사용되는 부울 값입니다. 이를 통해 PHP 엔진은 일반 변수를 참조 변수와 구별할 수 있습니다. refcount는 이 zval 변수 컨테이너를 가리키는 변수 수를 나타내는 데 사용됩니다. 0, 이는 변수가 삭제되거나 재활용될 수 있음을 의미합니다

    <?php
    $a = array( &#39;meaning&#39; => &#39;life&#39;, &#39;number&#39; => 42 );
    $a[&#39;life&#39;] = $a[&#39;meaning&#39;];
    xdebug_debug_zval( &#39;a&#39; );
    ?>

    위 루틴의 출력은 다음과 같습니다.

    a: (refcount=1, is_ref=0)=array (
       &#39;meaning&#39; => (refcount=2, is_ref=0)=&#39;life&#39;,
       &#39;number&#39; => (refcount=1, is_ref=0)=42,
       &#39;life&#39; => (refcount=2, is_ref=0)=&#39;life&#39;
    )

    Xdebug의 출력은 값이 있는 두 개의 zval 변수 컨테이너로 표시됩니다. ​​'life', 실제로는 동일함 A:

    <?php
    $a = array( &#39;one&#39; );
    $a[] =& $a;
    xdebug_debug_zval( &#39;a&#39; );
    unset($a);
    xdebug_debug_zval( &#39;a&#39; );
    ?>

    위 예의 결과는 다음과 같습니다.

    (refcount=1, is_ref=1)=array (
       0 => (refcount=1, is_ref=0)=&#39;one&#39;,
       1 => (refcount=1, is_ref=1)=...
    )

    위 예는 더 이상 범위를 가리키는 기호가 없지만 배열 요소 "1"이 여전히 배열 자체를 가리키므로 이 변수 ​​컨테이너를 지울 수 없습니다. 그것을 가리키는 다른 기호가 없기 때문에 사용자는 구조를 지울 수 없으며 결과적으로 메모리 누수가 발생합니다. PHP는 스크립트 실행이 끝나면 이 데이터 구조를 지우지만 PHP가 이를 지우기 전에 많은 메모리를 소비합니다

  2. 재활용 주기: 순환 참조로 인한 메모리 누수를 처리하는 데 사용할 수 있습니다. 변수 컨테이너의 참조 카운트가 증가하면 계속 사용되며 물론 더 이상 가비지에 있지 않습니다. 참조 카운트가 0으로 감소하면 변수 컨테이너가 지워집니다(무료). 즉, 가비지 사이클은 참조 카운트가 0이 아닌 값으로 감소할 때만 발생합니다. 둘째, 가비지 사이클에서는 참조 카운트가 1만큼 감소했는지 확인하고(시뮬레이션) 어떤 변수 컨테이너가 있는지 확인합니다. 참조가 있습니다. 어느 부분이 쓰레기인지 알아내기 위해 횟수는 0입니다

  3. 가비지 수집 메커니즘을 켜고 끄세요: 구성 zend.enable_gc를 수정하는 것 외에도 켤 수도 있습니다. gc_enable() 및 gc_disable() 함수를 각각 호출하고 가비지 수집 메커니즘을 끄면 됩니다. 또한 가비지 수집 메커니즘을 사용할 수 없는 경우에도 가능한 루트가 기록되므로 가능한 루트를 찾을 때마다 가비지 수집 메커니즘이 켜져 있는지 확인할 필요가 없으며 기록 작업이 더 빨라집니다. 주기 재활용을 강제하려면 gc_collect_cycles() 함수를 호출하세요.

위 내용은 PHP 가비지 수집 메커니즘이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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