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

巴扎黑
リリース: 2023-03-03 12:52:01
オリジナル
5490 人が閲覧しました

[はじめに] 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) に注目してください。

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