ホームページ >バックエンド開発 >PHPチュートリアル >PHPのガベージコレクションメカニズムの理解
[はじめに] PHP ガベージ コレクション メカニズムは php5 以降でのみ利用可能です。ここで、PHP ガベージ コレクション メカニズムについて少しご紹介します。これがすべての学生に役立つことを願っています。 PHP 5 および 3 より前に使用されていたガベージ コレクション メカニズムは、単純な参照カウントでした。つまり、PHP ガベージ コレクション メカニズムは、php5 以降にのみ登場したものです。リサイクルの仕組みを理解する一助になれば幸いです。
PHP 5.3 より前に使用されていたガベージ コレクション メカニズムは単純な「参照カウント」です。つまり、各メモリ オブジェクトにカウンタが割り当てられます。メモリ オブジェクトが変数によって参照されている場合、変数参照が削除されるとカウンタは 1 になります。 、カウンタ -1 ; カウンタ = 0 の場合、メモリ オブジェクトが使用されていないこと、メモリ オブジェクトが破棄されてガベージ コレクションが完了したことを示します。
「参照カウント」の問題は、2 つ以上のオブジェクトが相互に参照してリングを形成する場合、その時点でメモリ オブジェクトのカウンタが 0 に減らず、このメモリ オブジェクトのグループが存在しなくなることです。便利ですが、リサイクルできないため、メモリ リークが発生します。
php5.3 以降、参照カウントに基づいて、メモリ オブジェクト内の参照リングの存在を検出するための複雑なアルゴリズムが使用されています。メモリリークを避けるため。
このアルゴリズムについては、この短い概要の主な参考資料である次の記事を参照してください:): PHP5 のガベージ コレクション アルゴリズム (ガベージ コレクション) の進化に関する簡単な説明
以下の例を見てください
例 1: gc.php
<?php error_reporting(E_ALL); $a = 'I am test.'; $b = & $a; echo $b ."n"; ?>
言うまでもなく% php -f gc.php 出力結果は非常に明確です:
hy0kl% php -f gc.php I am test.
それでは次は:
例 2:<?php error_reporting(E_ALL); $a = 'I am test.'; $b = & $a; $b = 'I will change?'; echo $a ."n"; echo $b ."n"; ?> 执行结果依然很明显: hy0kl% php -f gc.php I will change? I will change?
<?php error_reporting(E_ALL); $a = 'I am test.'; $b = & $a; unset($a); echo $a ."n"; echo $b ."n"; ?>
hy0kl% php -f gc.php Notice: Undefined variable: a in /usr/local/www/apache22/data/test/gc.php on line 8 I am test.
少し混乱していますか?
もう一度見てください:
例 4:<?php error_reporting(E_ALL); $a = 'I am test.'; $b = & $a; unset($b); echo $a ."n"; echo $b ."n"; ?>
hy0kl% php -f gc.php I am test. Notice: Undefined variable: b in /usr/local/www/apache22/data/test/gc.php on line 9
もう一度見てください:
例 5:<?php error_reporting(E_ALL); $a = 'I am test.'; $b = & $a; $a = null;echo '$a = '. $a ."n"; echo '$b = '. $b ."n"; ?>
hy0kl% php -f gc.php $a = $b =
はい、これは PHP GC を深く理解している PHPer にとっては不思議ではないでしょう。正直に言うと、このコードを初めて実行したときは予想外でしたが、それによって PHP GC についての理解が深まりました。その後、それを使用する次の例は自然に理解しやすくなりました。
例 6:
<?php error_reporting(E_ALL); $a = 'I am test.'; $b = & $a; $b = null; echo '$a = '. $a ."n"; echo '$b = '. $b ."n"; ?>
上記。 PHP ガベージ コレクション メカニズムを理解するには、詳細については、PHP 中国語 Web サイト (www.php.cn) に注目してください。