ホームページ  >  記事  >  バックエンド開発  >  PHPのガベージコレクションメカニズムをマスターする

PHPのガベージコレクションメカニズムをマスターする

小云云
小云云オリジナル
2018-03-27 14:20:081782ブラウズ


php のガベージ コレクション メカニズムは、参照カウント、コピーオンライト、COW メカニズムとして簡単に要約できます。この記事では主に、php ガベージ コレクション メカニズムをマスターするための知識を共有し、皆様のお役に立つことを願っています。
  • 参照カウントの基礎知識 公式サイトの答えは以下の通りです

    • 各PHP変数は「zval」という変数コンテナに存在します

    • zval変数コンテナには、変数の型と値に加えて、変数には、2 バイトの追加情報 is_refrefcount も含まれますis_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 つあるため、その参照カウントは 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

    各変数には独自の番号があります

    PHP7のzval

    PHP7では、zvalが新しい実装になりました。最も基本的な変更は、zval に必要なメモリがヒープとは別に割り当てられなくなり、参照カウント自体も保存されなくなったことです。
  • 複雑なデータ型 (文字列、配列、オブジェクトなど) の参照カウントは、それ自体で保存されます
      。この実装には、次の利点があります。
    • 単純なデータ型では、メモリを個別に割り当てる必要がなく、カウントする必要もありません

    • オブジェクトには 2 つのカウントが保存されるだけになります。オブジェクト自体が有効です

    • カウントが値そのもので保存されるようになったので、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=0 の refcount が存在する場合、この zval はゴミになります
    • if the refcount zval が増加すると、この zval はまだ使用されており、ガベージではありません

    • zval の refcount が 0 に減れば、zval は解放でき、ガベージではありません

    zval の refcount が 0 に減れば、zval は解放されます。削減後の値が 0 より大きい場合、これ zval はまだ解放できず、この zval はガベージになる可能性があります

    関連する推奨事項:

    PHP のガベージ コレクション メカニズムの詳細な説明

    PHP ガベージ コレクションとは仕組み?

PHP5 Evolutionのガベージコレクション機構の分析🎜🎜🎜

以上がPHPのガベージコレクションメカニズムをマスターするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。