ホームページ >バックエンド開発 >PHPチュートリアル >PHP ガベージ コレクション メカニズムの概要 (コード例)
この記事では、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
各変数は独自の番号を記憶します PHP7Zval には、PHP7 で新しい実装が追加されました。最も基本的な変更は、zval に必要なメモリがヒープとは別に割り当てられなくなり、参照カウントが単独で保存されなくなったことです。複雑なデータ型 (文字列、配列、オブジェクトなど) の参照カウントは、それ自体で保存されます。 単純なデータ型では、メモリを個別に割り当てる必要がなく、カウントする必要もありません カウントが 2 つになることはなくなります。オブジェクト自体のみ 保存されたカウントは有効ですカウントは値自体によって保存されるため、zval とハッシュテーブル キーの間の間接アクセスに必要なポインターなど、zval 以外の構造データと共有できます。 数は減少しました
# 通常の変数 いいえ配列などの複雑な型は独自の数値を記憶します。ガベージとは何ですか?ガイドライン 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 サイトの他の関連記事を参照してください。