ガベージコレクションメカニズムを実装する理由は、循環参照された変数をクリーンアップしてメモリフットプリントを節約することです。
参照数: php変数は、「zval」と呼ばれる変数コンテナに保存されます。 zval 変数コンテナには、変数の型と値に加えて、is_ref と refcount という 2 バイトの追加情報も含まれています。 is_ref はブール値で、この変数が参照コレクションに属しているかどうかを識別するために使用されます。これにより、refcount = の場合、refcount は、この zval 変数コンテナーを指す変数の数を表すために使用されます。 0 は、変数をクリアまたはリサイクルできることを意味します
<?php $a = array( 'meaning' => 'life', 'number' => 42 ); $a['life'] = $a['meaning']; xdebug_debug_zval( 'a' ); ?>
上記のルーチンの出力は次のとおりです:
a: (refcount=1, is_ref=0)=array ( 'meaning' => (refcount=2, is_ref=0)='life', 'number' => (refcount=1, is_ref=0)=42, 'life' => (refcount=2, is_ref=0)='life' )
Xdebug の出力には、値を持つ 2 つの zval 変数コンテナが表示されます。 'life'、実際には同じです A:
<?php $a = array( 'one' ); $a[] =& $a; xdebug_debug_zval( 'a' ); unset($a); xdebug_debug_zval( 'a' ); ?>
上記の例の結果は次のとおりです:
(refcount=1, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=1, is_ref=1)=... )
上記の例ですが、スコープ内にこれを指すシンボルはもうありません。変数コンテナは、配列要素「1」が依然として配列自体を指しているため、このコンテナをクリアできません。他にそれを指すシンボルがないため、ユーザーは構造体をクリアする方法がなく、メモリ リークが発生します。 PHP はスクリプト実行の最後にこのデータ構造をクリアしますが、PHP がクリアする前に大量のメモリを消費します
リサイクル サイクル: 循環参照によって引き起こされるメモリ リークに対処するために使用できます。変数コンテナの参照カウントが増加すると、変数コンテナは引き続き使用され、当然ゴミには入れられなくなります。参照カウントがゼロに減少すると、変数コンテナはクリアされます (解放されます)。つまり、ガベージ サイクルは、参照カウントが 0 以外の値に減らされた場合にのみ発生します。次に、ガベージ サイクルでは、参照カウントが 1 減ったかどうか (シミュレート)、およびどの変数コンテナがあったかを確認します。参照あり 回数は 0 で、どの部分がガベージであるかを確認します
ガベージ コレクション メカニズムをオンまたはオフにします: 設定 zend.enable_gc を変更するだけでなく、オンにすることもできますgc_enable() 関数と gc_disable() 関数をそれぞれ呼び出して、ガベージ コレクション メカニズムをオフにします。さらに、ルート候補はガベージ コレクション メカニズムが利用できない場合でも記録されるため、ルート候補が見つかるたびにガベージ コレクション メカニズムがオンになっているかどうかを確認する必要がなくなり、記録操作が高速化されます。 gc_collect_cycles() 関数を呼び出して、サイクルのリサイクルを強制します。
以上がPHPのガベージコレクション機構とは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。