phpごみ回収メカニズム-phpリファレンスカウントの基本知識点

2495 ワード

前言
はい、いつも大牛が言っているgcは、ごみ回収器で、Garbage Collectionと呼ばれています.
初期バージョンでは、正確には5.3以前(5.3を除く)のゴミ回収メカニズムであり、専門のゴミ回収器はなかった.変数のzvalのrefcountが0であるかどうかを簡単に判断しただけで、そうであればプロセスが終わるまで解放しない.
一見、確かに問題はありませんが、変数メモリがオーバーフローするリスクが隠されています.http://bugs.php.net/bug.php?id=33595 回収できないメモリがメモリ漏れの原因となっているため、PHP 5.3にはゴミデータの整理やメモリ漏れの防止に特化したGCが登場した.
phpリファレンスカウントの基本知識点
まず、ごみ回収を引き起こす重要な基数についてお話ししなければなりません.
phpのzval構造体について、refcountとis_refの知識点,菜鳥学php拡張の詳細なphp拡張の変数(四) 説明がはっきりしている.
         : 
refcount:               ,        。 
is_ref:bool  , refcount  2   ,          &       ,  ,    1 。

主にphpでこれらのカウントの変化を直感的に見て、波を打つ方法について話します.  まずphpにxdebugの拡張子を装着する必要があります.
1.手順1:内部構造の表示

次のようになります.
name:(refcount=1, is_ref=0),string '      ' (length=18)

2.ステップ2:カウントを1つ増やす

次のようになります.
name:(refcount=2, is_ref=0),string '      ' (length=18)

見えたでしょう、refcount+1です.
3.ステップ3:参照割付

次のようになります.
name:(refcount=2, is_ref=1),string '      ' (length=18)

はい、参照付与によりzvalがis_を通過します.refは、参照が存在するか否かをマークする.
4.ステップ4:配列型の変数
'   ', 'b'=>'   '];
    xdebug_debug_zval('name');

次のようになります.
name:
(refcount=1, is_ref=0),
array (size=2)
  'a' => (refcount=1, is_ref=0),string '   ' (length=9)
  'b' => (refcount=1, is_ref=0),string '   ' (length=9)

よく理解できますが、配列にとっては全体であり、内部kvにとってはそれぞれ独立した全体であり、それぞれzvalのrefountとis_を維持しています.ref.
5.ステップ5:変数の破棄

次のようになります.
name:(refcount=2, is_ref=0),string '      ' (length=18)
name:(refcount=1, is_ref=0),string '      ' (length=18)

refcountカウントマイナス1は、unsetが必ずしもメモリを解放するわけではないことを示し、2つの変数が指す場合、変数が占有するメモリを解放するわけではなく、refcountマイナス1である.
 
詳細は転載を参照してください.https://blog.csdn.net/u011957758/article/details/76864400