ホームページ  >  記事  >  バックエンド開発  >  PHPでの参照とガベージコレクションの分析

PHPでの参照とガベージコレクションの分析

不言
不言オリジナル
2018-09-04 17:43:591349ブラウズ

この記事の内容は、PHP における参照の解析とガベージ コレクションに関するもので、一定の参考価値があります。困っている友人は参考にしていただければ幸いです。

各 PHP 変数は、「zval」という変数コンテナーに存在します。 zval 変数コンテナには、変数の型と値に加えて、2 バイトの追加情報が含まれています。 1 つ目は「is_ref」で、この変数が参照セットに属しているかどうかを識別するために使用されるブール値です。このバイトを通じて、PHP エンジンは通常の変数と参照変数を区別できます。PHP ではユーザーが & を使用してカスタム参照を使用できるため、zval 変数コンテナにはメモリ使用量を最適化するための内部参照カウント メカニズムもあります。 2 番目の追加バイトは「refcount」で、この zval 変数コンテナーを指す変数 (シンボルとも呼ばれます) の数を示すために使用されます。すべてのシンボルはシンボル テーブルに存在し、各シンボルにはスコープ (スコープ) があり、メイン スクリプト (例: ブラウザを通じて要求されたスクリプト)、および各関数またはメソッドにもスコープがあります。

//php 内のオブジェクトは参照によって渡されます

is_ref = 0, refcount = 0 zval コンテナーはスクリプト実行の最後に破棄されます

公式の例からの引用

<?php
$a = array( &#39;one&#39; );
$a[] =& $a;
xdebug_debug_zval( &#39;a&#39; );
a: (refcount=2, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)='one',
   1 => (refcount=2, is_ref=1)=...
)

自引用(curcular reference,自己是自己的一个元素)的数组的zval

unset$a を実行すると、変数と zval の間のメモリの関連付けが解放されますが、閉じたループ自体はまだ存在します

(refcount=1, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)=&#39;one&#39;,
   1 => (refcount=1, is_ref=1)=...
)

Zvals after removal of array with a circular reference demonstrating the memory leak

ただし、現時点では zval に操作できる変数はありません。コンテナ時間はメモリのゴミになっているため、解放できません。

リサイクル メカニズム:簡単に言うと、スクリプト実行後、残りのExisting変数はデータ全体のrefcountすべてに-1が使用され、0になるとゴミと判断されメモリコンテナが破棄されます。

関連する推奨事項:

PHP のガベージ コレクション メカニズムではどのような種類のガベージをリサイクルできますか? ガベージ コレクションではガベージをリサイクルできません

PHP ガベージ収集メカニズム - 参照カウントの基本知識

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。