>  기사  >  백엔드 개발  >  PHP 가비지 수집 메커니즘을 마스터하세요.

PHP 가비지 수집 메커니즘을 마스터하세요.

小云云
小云云원래의
2018-03-27 14:20:081829검색


php의 가비지 수집 메커니즘은 참조 카운팅, 기록 중 복사 및 COW 메커니즘으로 간단하게 요약될 수 있습니다. 이 기사는 주로 PHP의 가비지 수집 메커니즘을 마스터하는 지식을 공유하여 모든 사람에게 도움이 되기를 바랍니다.
  • 참조 카운팅에 대한 기본 지식 공식 홈페이지의 답변은 다음과 같습니다

    • 각 PHP 변수는 "zval"이라는 변수 컨테이너에 존재합니다.

    • zval 변수 컨테이너의 유형과 값 외에 변수에는 2바이트의 추가 정보 is_ref도 포함되며 refcountis_ref  和  refcount

    • is_ref 是个bool值,用来标识这个变量是否是属于引用集合(reference set)。通过这个字节,php引擎才能把普通变量和引用变量区分开来

    • refcount

    is_ref는 이 변수가 속하는지 여부를 식별하는 데 사용되는 부울 값입니다. 참조 세트(참조 세트). 이 바이트를 통해 PHP 엔진은 일반 변수와 참조 변수를 구별할 수 있습니다.

  • refcount는 이 zval 변수 컨테이너를 가리키는 변수의 수를 나타내는 데 사용됩니다.

    PHP5 참조

    PHP5에서 zval 메모리는 힙(몇 가지 예외 제외)과 별도로 할당되며, PHP는 어떤 zval이 사용 중이고 어떤 zval을 해제해야 하는지 알아야 합니다. 따라서 이를 위해서는 참조 계산을 사용해야 합니다. zval의 refcount__gc 값은 zval 자체가 참조된 횟수를 저장하는 데 사용됩니다(예:

b = 12). 명령문에서 12는 다음에 의해 참조됩니다. 변수가 두 개이므로 해당 참조 개수는 2입니다. 참조 횟수가 0이 되면 해당 변수는 더 이상 사용되지 않으며 메모리를 해제할 수 있다는 의미입니다.
    다음과 같이
  • <?php
    
    //php zval变量容器$a = 1;$b = 1;$c = &$a;$d = $b;$e = range(0, 3);
    
    xdebug_debug_zval(&#39;a&#39;);
    xdebug_debug_zval(&#39;b&#39;);
    xdebug_debug_zval(&#39;c&#39;);
    xdebug_debug_zval(&#39;d&#39;);
    xdebug_debug_zval(&#39;e&#39;);
    
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    
    结果如下
    
    a:(refcount=2, is_ref=1),int 1b:(refcount=2, is_ref=0),int 1c:(refcount=2, is_ref=1),int 1d:(refcount=2, is_ref=0),int 1e:(refcount=1, is_ref=0),
    array (size=4)
      0 => (refcount=1, is_ref=0),int 0
      1 => (refcount=1, is_ref=0),int 1
      2 => (refcount=1, is_ref=0),int 2
      3 => (refcount=1, is_ref=0),int 3

    각 변수에는 고유한 번호가 있습니다

    zval in PHP7
    • PHP7에서 zval은 새로운 구현을 가졌습니다. 가장 기본적인 변화는 zval에 필요한 메모리가 더 이상 힙과 별도로 할당되지 않으며 더 이상 참조 카운트 자체를 저장하지 않는다는 것입니다.
    • 복잡한 데이터 유형(예: 문자열, 배열, 객체)의 참조 횟수는 자체적으로 저장됩니다

      . 이 구현에는 다음과 같은 이점이 있습니다.

    • 단순 데이터 유형은 메모리를 별도로 할당할 필요가 없으며 계산할 필요도 없습니다.
    • 개체에는 더 이상 두 개의 계산이 없으며 개체에 저장된 개수만 있습니다. 객체 자체가 효과적입니다
    • 이제 값 자체로 카운트가 저장되므로 zval과 해시 테이블 키 사이 등 zval이 아닌 구조 데이터와 공유할 수 있습니다

간접에 필요한 포인터 수 액세스가 줄어듭니다


  • <?php
    
    //php zval变量容器$a = 1;$b = 1;$c = &$a;$d = $b;$e = range(0, 3);
    
    xdebug_debug_zval(&#39;a&#39;);
    xdebug_debug_zval(&#39;b&#39;);
    xdebug_debug_zval(&#39;c&#39;);
    xdebug_debug_zval(&#39;d&#39;);
    xdebug_debug_zval(&#39;e&#39;);
    
    
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    结果如下
    
    a:(refcount=2, is_ref=1)int 1b:(refcount=0, is_ref=0)int 1c:(refcount=2, is_ref=1)int 1d:(refcount=0, is_ref=0)int 1e:(refcount=1, is_ref=0)array (size=4)
      0 => (refcount=0, is_ref=0)int 0
      1 => (refcount=0, is_ref=0)int 1
      2 => (refcount=0, is_ref=0)int 2
      3 => (refcount=0, is_ref=0)int 3

    일반 변수는 더 이상 자신의 숫자를 기억하지 않습니다. 배열과 같은 복잡한 유형은 자신의 숫자를 기억합니다.

    가비지란 무엇입니까
    • 지침 3에서만 GC는 zval을 수집한 다음 사용합니다. 이 zval이 쓰레기인지 여부를 결정하는 새로운 알고리즘입니다. 그렇다면 그러한 변수가 진짜 쓰레기인지 어떻게 판단할 수 있을까요?
    • 간단히 말하면, 이 zval의 각 요소에 대해 refcount 빼기 1 작업을 수행하는 것입니다. 작업이 완료된 후 zval의 refcount가 0이면 이 zval은 가비지입니다.

    • zval이 증가하면 이 zval은 여전히 ​​사용 중이며 쓰레기가 아닙니다
    • zval의 참조 카운트가 0으로 감소하면 zval은 해제될 수 있으며 쓰레기가 아닙니다

    zval의 참조 카운트가 있는 경우 감소한 후 0보다 크면 zval은 아직 해제될 수 없으며 이 zval은 쓰레기가 될 수 있습니다

    관련 권장 사항:

    PHP의 가비지 수집 메커니즘에 대한 자세한 설명

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

🎜🎜PHP5 Evolution의 가비지 수집 메커니즘 분석🎜🎜🎜

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

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