この記事では、PHP のガベージ コレクションの仕組み (コード例) を紹介します。一定の参考価値があります。困っている友人は参考にしてください。お役に立てれば幸いです。
PHP のガベージ コレクション メカニズムは、参照カウント コピーオンライト COW メカニズムとして簡単に要約できます。
この記事では主に、PHP ガベージをマスターするための知識を共有します。回収の仕組みが皆様のお役に立てれば幸いです。
参照カウントの基礎知識
公式サイトの答えは以下の通りです 各 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
# 通常の変数 いいえ配列などの複雑な型は独自の数値を記憶します。ガベージとは何ですか?ガイドライン 3 に基づいてのみ、GC は zval を収集し、新しいアルゴリズムを渡して決定します。このzvalがゴミかどうか。では、そのような変数が本当にゴミであるかどうかを判断するにはどうすればよいでしょうか? ##簡単に言うと、この zval の各要素に対して refcount から 1 を引いた演算を実行することです。演算完了後、zval の refcount=0 であれば、この zval はゴミですIf zval の refcount が増加する場合、zval はまだ使用中であり、ガベージには属しません。zval の refcount が 0 に減少する場合、zval は解放でき、ガベージには属しません。 refcount が減らされた後の zval が 0 より大きい場合、この zval は解放できず、この zval はガベージになる可能性があります。 ##<?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
以上がPHP ガベージ コレクション メカニズムの概要 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。