今回は、PHP ガベージ コレクション メカニズムの使用に関する事例分析をお届けします。PHP ガベージ コレクション メカニズムを使用する際の 注意事項 は何ですか? 以下は実際の事例です。
1. 各変数が定義されると、zval と呼ばれるコンテナーに保存されます。このコンテナーには、数量のタイプと値、refcount (変数の数として理解される) および is_ref (変数の数として理解されます) が含まれます。参照変数) 2 つの追加情報。変数が 1 回参照されると、refcount は +1 され、値は 0 になるまで 1 減らされ、メモリから削除されます。変数の定義 PHP は変数を宣言するときにメモリ内のスペースを事前に占有して割り当てますが、この事前に占有されているスペースを超えると、スペースが増加するため、事前に設定された値が毎回展開されるわけではありません。 . ですが、変数を削除してもすぐに容量が消えるわけではありません3. 変数の参照だけではメモリ使用量が増加するわけではなく、zval構造体
を指すだけで、refcount+14になります。簡単に説明すると、PHP 変数
は、symbol_table シンボル テーブルの内部実装に依存しており、シンボル テーブルの基本実装は HashTable であり、これはPHP 配列 の基本実装と一致しています。実際、シンボル テーブルの存在により、global を使用してグローバル変数をマークしたり、compact などの関数を使用して現在のシンボル テーブルから変数を直接取り出すことができます。 質問で述べたように、unset($a) がスペースをすぐに解放するかどうかについて話しましょう。答えはノーです。Unset は、シンボル テーブルからの a という名前の要素の削除をサポートします (スペースを解放するのではなく、このスペースをマークするだけです。 )。
同じ名前の変数が更新されるため、更新すると同じ位置の $key の値が更新される状況について説明します。前の要素はすぐに上書きされます。 新しい変数を宣言するとメモリが増加するという問題について話しましょう。答えは不確かです。これは、HashTable に基づいて実装されたシンボル テーブルの機能によるものです。HashTable は、要素を追加するときに 1 つの要素のメモリに適用されませんが、HashTable の場合は複数の要素のメモリに一度に適用されます。 full、When、複数の要素の新しいメモリを適用します。つまり、変数を宣言または代入するときに、その変数がシンボル テーブルにない場合、PHP はその変数をシンボル テーブルに追加します。この時点でシンボル テーブルがいっぱいでない場合は、その変数が存在するシンボル テーブルを使用します。メモリに適用されているが使用されていない場合、シンボル テーブルがいっぱいの場合は、新しいメモリがストレージに適用されます。新しいメモリは、この変数に必要なメモリと同じだけではありませんこの方法は習得できたと思います。この記事の事例を読んだ後は、さらに刺激的になります。php 中国語 Web サイトの他の関連記事にもご注目ください。 推奨読書:公開キー暗号化手順を実装するための PHP+openssl 拡張機能の詳細な説明
以上がPHP ガベージ コレクション メカニズムのユースケース分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。