この記事では、PHP でプログラムを作成する際のヒントと、メモリ解放とガベージ コレクションに関する問題について説明します。興味のある方はぜひ参考にしてください。
参照の割り当て
$a = 'apple'; $b = &$a;
上記のコードでは、文字列を変数 a に割り当ててから、の参照が変数 b に代入されます。明らかに、この時点で指すメモリは次のようになります。
$a -> 'apple' <- $b
a と b は同じメモリ領域を指し、var_dump($a, $ を渡します) b ) string(5) "apple" string(5) "apple" を取得します。これは期待どおりです。
unset function
文字列「apple」をメモリから解放したいとします。これが私がやったことです:
unset($a);
しかし、2 つの変数 $a $b の情報を再度出力すると、次の結果が得られました。 注意: 未定義の変数: a と string(5) "apple" 。奇妙なことに、$a と $b は両方ともメモリ領域を指しているのに、$a が明らかに解放されているのに、なぜ $b は依然として「apple」のままなのでしょうか。
実際には、unset() は変数ポインタを破棄し、そのメモリ領域に格納されている文字列を解放しません。したがって、操作が完了した後、メモリ ポインタは次のようになります。
'apple' <- $b
覚えておくべき重要な点: unset() は変数が指すメモリを解放せず、変数ポインタを破棄するだけです。同時に、そのメモリ部分の参照カウントを 1 ずつ減らします。参照カウントが 0 の場合、つまり、そのメモリ部分がどの変数からも参照されていない場合、PHP のガベージ コレクションがトリガーされます。
直接リサイクル
では、「apple」が占有しているメモリを実際に解放するにはどうすればよいでしょうか?
上記のメソッドを使用すると、unset($a) してから unset($b) を実行して、メモリ領域内のすべての参照を破棄し、参照カウントが 0 になると、PHP によって自然にリサイクルされます。 。
もちろん、もっと直接的な方法もあります。
$a = null;
null を直接割り当てると、$a が指すメモリ領域が空になります。参照カウントはゼロにリセットされ、メモリは解放されます。
スクリプト実行の終了
php はスクリプト言語です。スクリプトの実行が終了すると、スクリプトで使用されていたすべてのメモリが解放されます。
上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。
関連する推奨事項:
PHP の move_uploaded_file() 関数の分析について
PHP の var_export、print_r、および var_dump についてデバッグの違い
以上がPHPのメモリ解放とガベージコレクションの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。