PHPのガベージコレクション機構とは何ですか

一个新手
リリース: 2023-03-16 06:20:01
オリジナル
1497 人が閲覧しました

ガベージコレクションメカニズムを実装する理由は、循環参照された変数をクリーンアップしてメモリフットプリントを節約することです。

  1. 参照数: php変数は、「zval」と呼ばれる変数コンテナに保存されます。 zval 変数コンテナには、変数の型と値に加えて、is_ref と refcount という 2 バイトの追加情報も含まれています。 is_ref はブール値で、この変数が参照コレクションに属しているかどうかを識別するために使用されます。これにより、refcount = の場合、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 の出力には、値を持つ 2 つの 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 以外の値に減らされた場合にのみ発生します。次に、ガベージ サイクルでは、参照カウントが 1 減ったかどうか (シミュレート)、およびどの変数コンテナがあったかを確認します。参照あり 回数は 0 で、どの部分がガベージであるかを確認します

  3. ガベージ コレクション メカニズムをオンまたはオフにします: 設定 zend.enable_gc を変更するだけでなく、オンにすることもできますgc_enable() 関数と gc_disable() 関数をそれぞれ呼び出して、ガベージ コレクション メカニズムをオフにします。さらに、ルート候補はガベージ コレクション メカニズムが利用できない場合でも記録されるため、ルート候補が見つかるたびにガベージ コレクション メカニズムがオンになっているかどうかを確認する必要がなくなり、記録操作が高速化されます。 gc_collect_cycles() 関数を呼び出して、サイクルのリサイクルを強制します。

以上がPHPのガベージコレクション機構とは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!