PHP のガベージ コレクション メカニズムは、参照カウントとコピーオンライト COW メカニズムとして簡単に要約できます。
この記事では主に、PHP ガベージ コレクション メカニズムをマスターするための知識を共有し、皆様のお役に立てれば幸いです。 [推奨チュートリアル: php チュートリアル]
参照カウントの基礎知識
公式 Web サイトの答えは次のとおりです: 各 php 変数には、 という変数コンテナーに zval 変数があります。 "zval" 変数の型と値に加えて、コンテナには 2 バイトの追加情報 is_ref と 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('a'); xdebug_debug_zval('b'); xdebug_debug_zval('c'); xdebug_debug_zval('d'); xdebug_debug_zval('e'); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
結果は次のとおりです
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
<?php //php zval变量容器 $a = 1; $b = 1; $c = &$a; $d = $b; $e = range(0, 3); xdebug_debug_zval('a'); xdebug_debug_zval('b'); xdebug_debug_zval('c'); xdebug_debug_zval('d'); xdebug_debug_zval('e'); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
結果は次のとおりです 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 の refcount が増加すると、zval はゴミになります。はまだ使用されています。ガベージではありません。zval の refcount が 0 に減らされた場合、zval は解放できます。zval の refcount が 0 より大きく減らされた場合、zval は解放できず、zvalゴミになるかもしれない。
以上がPHPのガベージコレクションメカニズムとは何ですか? PHPのガベージコレクションの仕組みを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。