解決の部分の変化にGC機構PHPのバージョン

原因:次の記事があります側のブラシで、このような話題「PHPのガベージコレクション機構」は、最初の反応は、変数がゴミであるとアウトかどうかを決定するために、このような機構PHPが使用する参照をカウントすることで、あるオンラインリファレンス

https://m.php.cn/topic/php7/425508.html詳細PHP7ガベージコレクション

内部のコードのようにAピースがあります

#官方例子
$a = 1;
$b = $a;
xdebug_debug_zval('a');
$a =10;
xdebug_debug_zval('a');
unset($a);
xdebug_debug_zval('a');
#结果
a:(refcount=2, is_ref=0)=1
a:(refcount=1, is_ref=0)=10
a: no such symbol

次のようにネイティブPHP(PHP7.3.4)を使用して、厳格な奨学金の態度の性質上、結果は次のとおりです。

説明:参照カウントコンテナ統計の数を指すように、変数、変数に割り当てられた統計的変数コンテナの現在の数を参照するis_ref、$ B = A R E F C インクルード n個 トン + + 、参照カウント++、 B =&$、参照カウント++、is_ref ++

a: (refcount=0, is_ref=0)=1
a: (refcount=0, is_ref=0)=10
a: no such symbol

何が偽造医薬品を販売し、タイトル「説明するPHP7のガベージコレクション機構」明らかに、それを尋ねたのですか?

PHP7.2.9の営業成績:

a: (refcount=0, is_ref=0)=1
a: (refcount=0, is_ref=0)=10
a: no such symbol

PHP7.0.9の営業成績:

a: (refcount=0, is_ref=0)=1
a: (refcount=0, is_ref=0)=10
a: no such symbol

PHP5.3.29の営業成績:

a: (refcount=2, is_ref=0)=1
a: (refcount=1, is_ref=0)=10
#该版本中,如果变量被注销,使用xdebug_debug_zval()函数将无输出

PHP5.2.xバージョンGCメカニズム以上のバージョンは、単純なカウントを使用し、ここで議論すべきでありません

変数代入、参照カウント= 1、価値転送モード割り当て、参照カウント= 2が、何バージョンPHP7.xで発生が与えられたとき、正常範囲、PHP5.3で理解バージョンは、それが容易に理解されますそれを変更?

PHP7开始, 对于在zval的value字段中能保存下的值, 就不再对他们进行引用计数了, 而是在拷贝的时候直接赋值, 这样就省掉了大量的引用计数相关的操作, 这部分类型有:
IS_LONG
IS_DOUBLE
当然对于那种根本没有值, 只有类型的类型, 也不需要引用计数了:
IS_NULL
IS_FALSE
IS_TRUE

これはPHP7.xバージョンで謎を解決することができますので、これらのタイプのデータのための参照は、変数の割り当て送信モードの値、COWを使用しては(上のコピーカウントダウンしても結果で見ることができません書き込み同じメモリアドレスへの2つの変数ポイントに通常割り当てのような)機構、PHP直接、一つの値だけが変更されると、値は、新たなメモリ空間を開きますは、変数の変更を格納するために使用しました

运行环境:PHP5.3.9
#值传递
$a = 1;
$b = $a;
xdebug_debug_zval('a');
$a =10;
xdebug_debug_zval('a');
unset($a);
xdebug_debug_zval('a');
#结果
a:(refcount=2, is_ref=0)=1
a:(refcount=1, is_ref=0)=10
a: no such symbol
#引用传递
$a = 1;
$b = &$a;
xdebug_debug_zval('a');
$a =10;
xdebug_debug_zval('a');
unset($a);
xdebug_debug_zval('a');
#结果
a:(refcount=2, is_ref=1)=1
a:(refcount=2, is_ref=1)=10
a: no such symbol

別の例:

#代码
$a = array(1,'one');
xdebug_debug_zval('a');
#PHP5.3.29结果
a: (refcount=1, is_ref=0)=array (0 => (refcount=1, is_ref=0)=1, 1 => (refcount=1, is_ref=0)='one')
#PHP7.0.9结果
a: (refcount=1, is_ref=0)=array (0 => (refcount=0, is_ref=0)=1, 1 => (refcount=2, is_ref=0)='one')
#PHP7.2.9结果
a: (refcount=2, is_ref=0)=array (0 => (refcount=0, is_ref=0)=1, 1 => (refcount=1, is_ref=0)='one')
#PHP7.3.4结果
a: (refcount=2, is_ref=0)=array (0 => (refcount=0, is_ref=0)=1, 1 => (refcount=1, is_ref=0)='one')

可視、PHP7.2.xは以前に、アレイの定義については、その参照カウントは1であり、およびそれ以降のバージョンの参照カウントは2であり、PHPアレイの開発者は言って、このようなAを有します

アレイの未refcounted変異体「は、不変配列」と呼ばれます。あなたがopcacheを使用する場合は、あなたのコード内の定数配列リテラルは不変の配列に変換されます。もう一度、共有メモリ内や、しなければならないので、ライブこれらは参照カウントは使用しません。それが私たちは、特定の分離経路を最適化することを可能にするように不変のアレイは、2のダミー参照カウントを有します。

別のPHP7.2.x擬似2を用いた非変数、カウント値のグループ、不変配列(ない変数グループ)と呼ばれる概念を含みます。

このタイプは、直接この断言1をその()(「時間」=>時間)= 2あなたは、配列を見ることができます参照カウントの配列array(1,2,3)の規定を肯定されます

对于常量数组
#PHP7.0.9
#PHP5.3.29
a: (refcount=1, is_ref=0)=array (0 => (refcount=0, is_ref=0)=1, 1 => (refcount=0, is_ref=0)=2)
#PHP7.3.4
#PHP7.2.9
a: (refcount=2, is_ref=0)=array (0 => (refcount=0, is_ref=0)=1, 1 => (refcount=0, is_ref=0)=2)
对于非常量数组
#PHP7.3.4
#PHP7.2.9
#PHP7.0.9
#PHP5.3.29
a: (refcount=1, is_ref=0)=array (0 => (refcount=0, is_ref=0)=1582285249)

格納された符号列のアレイに対してのみ演算結果が示されているPHP7.0.9の参照カウントが2である、メジャーバージョンアップグレードの一部に残存するように最適化することができます

循環参照

#例子
$a = array(1);
$a[1] = &$a;
xdebug_debug_zval('a');
unset($a);
xdebug_debug_zval('a');
#结果
a: (refcount=2, is_ref=1)=array (0 => (refcount=1, is_ref=0)=1, 1 => (refcount=2, is_ref=1)=...)

メモリ内の変数は、言いました:

ここに画像を挿入説明

循環参照のメモリリークが発生します

ゴミをクリーンアップするために、我々は2つの基準をご紹介します

  • コンテナ変数がクリアされてゼロになる参照カウント、(無料)は、スパムではない場合
  • カウントが0より大きい参照zvalをさらにデクリメントする場合、それはゴミにサイクルになります。基準カウント数を1だけデクリメントし、容器検査基準変数がごみである部品を見つけるために、ゼロである。れているかどうかをチェックすることにより、ごみの期間において次に、

基本的にのみ、その文献のオブジェクト自体、参照配列とオブジェクト円形で表示され

リカバリ処理の対象と配列

PHP7ガベージコレクションは二つの部分、ガベージコレクタ、ガベージコレクションのアルゴリズムを含みます。

ガベージコレクタは、今述べた、プールを再利用するために、ガベージコレクションの要素であってもよい回復プールで0にzend_refcount変数>変数です。場合回収タンクの値が一定量に達すると、統一されたプロセスを横断します。zend_refcount = 0、その後みなさごみは、それを削除した場合のシミュレートを除去しました。

ネストされたのメンバーが存在する場合、各部材を介して、次に、各変数の回復プールを横断する各変数に応じて、及び、その後横断し続けます。そして、すべてのメンバーは、シミュレーションの参照カウントを行うには-1。この時点であれば、外部変数の参照番号0。これは、ゴミの除去とみなすことができます。0よりも大きい場合には、時間、ガベージコレクション、プールから削除の回復参照番号。

参考:

https://blog.csdn.net/qq_36172443/article/details/82291385

https://blog.csdn.net/black_ox/article/details/50341225

https://ask.csdn.net/questions/706390

公開された13元の記事 ウォンの賞賛9 ビュー3514

おすすめ

転載: blog.csdn.net/zdy_lyq/article/details/104433638