ホームページ  >  記事  >  バックエンド開発  >  PHPのガベージコレクションメカニズムの理解

PHPのガベージコレクションメカニズムの理解

巴扎黑
巴扎黑オリジナル
2018-05-16 10:39:165456ブラウズ

[はじめに] 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 = &#39;I am test.&#39;; 
$b = & $a;
echo $b ."n"; 
?>

言うまでもなく% php -f gc.php 出力結果は非常に明確です:

hy0kl% php -f gc.php 
I am test.

それでは次は:

例 2:

<?php 
error_reporting(E_ALL); 
$a = &#39;I am test.&#39;; 
$b = & $a;
$b = &#39;I will change?&#39;;                                                         
echo $a ."n"; 
echo $b ."n"; 
?>
执行结果依然很明显:
hy0kl% php -f gc.php 
I will change?
I will change?

見てください:

例 3 :

<?php 
error_reporting(E_ALL); 
$a = &#39;I am test.&#39;; 
$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 = &#39;I am test.&#39;; 
$b = & $a;
unset($b);                                                                     
echo $a ."n"; 
echo $b ."n";
?>

実際、例 3 を理解していれば、これも同じ目的です。 .

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 = &#39;I am test.&#39;; 
$b = & $a;
$a = null;echo &#39;$a = &#39;. $a ."n"; 
echo &#39;$b = &#39;. $b ."n"; 
?>

暴力の最初の感情は何ですか?

hy0kl% php -f gc.php 
$a = 
$b =

はい、これは PHP GC を深く理解している PHPer にとっては不思議ではないでしょう。正直に言うと、このコードを初めて実行したときは予想外でしたが、それによって PHP GC についての理解が深まりました。その後、それを使用する次の例は自然に理解しやすくなりました。

例 6:

<?php                                                                         
error_reporting(E_ALL); 
$a = &#39;I am test.&#39;; 
$b = & $a;
$b = null;
echo &#39;$a = &#39;. $a ."n"; 
echo &#39;$b = &#39;. $b ."n"; 
?>

上記。 PHP ガベージ コレクション メカニズムを理解するには、詳細については、PHP 中国語 Web サイト (www.php.cn) に注目してください。

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