PHP5 と PHP7 のガベージ コレクション メカニズムの違いは何ですか?

醉折花枝作酒筹
リリース: 2023-02-18 06:58:01
転載
1850 人が閲覧しました

php5 と php7 のガベージ コレクション メカニズムはすべて参照カウントを使用します。PHP は C で書かれているため、C には構造体と呼ばれるものがあります。PHP 変数はこの方法で C に保存されます。今日は、PHP5 と PHP7 のガベージ コレクション メカニズムの違いを学びます。

PHP5 と PHP7 のガベージ コレクション メカニズムの違いは何ですか?

php5 と php7 のガベージ コレクション メカニズムは両方とも参照カウントを使用します

まず参照カウントとは何かを見てみましょう:

PHP は C で書かれているため、C には構造体と呼ばれるものがあります。PHP 変数は、C ではこの方法で保存されます。

各 PHP 変数は、zval コンテナーの中の、 zval コンテナには、変数名と値が含まれるだけでなく、2 バイトの追加情報も含まれています。1 つは「is_ref」と呼ばれ、変数が参照セットに属しているかどうかを示すために使用されるブール値です。このバイトを通じて、 PHP では、通常の変数と参照変数を区別できますか。2 番目の余分なバイトは 'refcount' で、このコンテナを指す変数の数を示すために使用されます

PHP で変数を定義します

$name='看看';
ログイン後にコピー

xdebug_debug_zval() 関数を使用して、関数内の変数に関する関連情報を取得できるようになりました。

xdebug_debug_zval('name');
//输出 name:(refcount=1,is_ref=0)='new String'
现在我们把$name赋值给$money
$money = $name;
ログイン後にコピー

もう一度確認してみましょう:

xdebug_debug_zval('name');
//输出 name:(refcount=2,is_ref=0)='new String'
ログイン後にコピー

この時点で、refcount フィールドの値が表示されます。 1 を追加しました (これは、2 つの既存の変数が name という名前の同じ aval コンテナーを指していることを意味します)

参照カウントのルールに従って、refcount=0 の場合、PHP はこのコンテナーをガベージとして扱います。

#同様に、

unset($name); //一样也会把name容器的引用计数设置为0
ログイン後にコピー

を実行します。

上記の結論はスカラー型のみに当てはまります。型を担当する

配列を見てみましょう:

$person=['name'=>'请欢','age'=>19];
var_dump(xdebug_debug_zval('person'));
在PHP5输出:
person:
(refcount=1, is_ref=0),
array (size=2)
  'name' => (refcount=1, is_ref=0),string '看看' (length=6)
  'age' => (refcount=1, is_ref=0),int 19
ログイン後にコピー

PHP7 での出力:

person:
(refcount=2, is_ref=0)
array (size=2)
  'name' => (refcount=1, is_ref=0)string '看看' (length=6)
  'age' => (refcount=0, is_ref=0)int 19
ログイン後にコピー

複雑なデータ型の場合、PHP5 と PHP7 の参照カウント アルゴリズムが異なることがわかります

ループを試してみましょう引用文

上記のコードに基づいて、次のコード行を追加します。

$person['hello'] = $person['name']
ログイン後にコピー

PHP7 での出力:

person:
(refcount=1, is_ref=0)
array (size=3)
  'name' => (refcount=3, is_ref=0)string '看看' (length=6)
  'age' => (refcount=0, is_ref=0)int 19
  'hello' => (refcount=3, is_ref=0)string '看看' (length=6)
ログイン後にコピー

PHP5 での出力:

person:
(refcount=1, is_ref=0),
array (size=3)
  'name' => (refcount=2, is_ref=0),string '看看' (length=6)
  'age' => (refcount=1, is_ref=0),int 19
  'hello' => (refcount=2, is_ref=0),string '看看' (length=6)
ログイン後にコピー

短い概要:

PHP5 と PHP7 のガベージ コレクション メカニズムはどちらも参照カウントに属しますが、複雑なデータ型のアルゴリズム処理に関しては次のようになります。

PHP7 では、zval が新しい実装になりました。最も基本的な変更は、*zval で必要なメモリがヒープとは別に割り当てられなくなり、参照カウントが単独で格納されなくなったことです。複雑なデータ型 (文字列、配列、オブジェクトなど) の参照カウントは、それ自体で保存されます。この実装には次の利点があります: *

*単純なデータ型はメモリを個別に割り当てる必要がなく、カウントする必要もありません。*

*二重にカウントされることはなくなります。オブジェクトでは、オブジェクト自体に保存されているカウントのみが有効です。*

*カウントは値自体によって保存されるため、zval 間など、非 zval 構造内のデータと共有できます。およびハッシュテーブル キー; *

推奨学習: php ビデオ チュートリアル

以上がPHP5 と PHP7 のガベージ コレクション メカニズムの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!