ホームページ >バックエンド開発 >PHPチュートリアル >PHP ガベージ コレクション メカニズム ----コピーオンライトと参照カウント
PHP は参照カウントとコピーオンライトを使用してメモリを管理します。コピーオンライトにより、変数間で値をコピーしてもメモリが無駄にならないことが保証され、参照カウントにより、変数が不要になったときにメモリがオペレーティング システムに解放されます。
PHP のメモリ管理を理解するには、まず概念とシンボルのテーブルを理解する必要があります。
シンボルテーブルの概念:
変数は変数名と変数値の2つの部分から構成されます。シンボル テーブルは、変数名をメモリ内の変数値のアドレスにマップする配列です。
書きながらコピーします:
ある変数の値が別の変数にコピーされるとき、PHP はコピーされた値のためにそれ以上のメモリを使用しません。代わりに、2 つの変数が同じメモリ ブロックに属していることを示す新しいシンボル テーブルを追加します。したがって、以下のコードは実際には新しい配列を作成しません:
$people = array( "アリス","ボブ" );
$other = $people; //配列はコピーされません
?>
コピーのいずれかを変更すると、PHP はコピーの作成に必要なメモリを割り当てます。
$people[ 1 ] = "Tom"; //値が変更され、配列がコピーされ、新しいメモリが割り当てられます
割り当てとコピーを遅らせることにより、PHP は多くの状況で時間とメモリを節約します。これがコピーオンライトです。
引用数:
シンボルテーブルの各位置には参照カウンタがあり、その値はそのメモリを取得する方法の数を表します。
初期化して$peopleと$otherに値を代入すると、配列はシンボルテーブルを指し、$peopleと$otherの参照カウンタの値は2になります。つまり、それを取得するには2つの方法があります記憶の一部: $people と $other。
しかし、$people[1] が変更されると、PHP は $people の新しい配列を作成します。このとき、$people と $other の参照カウンタの値は両方とも 1 になります。変数がスコープを離れると、このようになります。関数パラメータとしてローカル変数が関数の最後に到達すると、アプリケーション カウンタの値が 1 減分されます。変数に他のメモリ空間の値が代入されると、古い値の参照カウントが 1 減分されます。参照カウントが 0 に達すると、そのメモリは解放されます。
これは参照カウントです。
参照カウントは推奨されるメモリ管理方法です。変数スコープを関数内に保持し、それらを値で渡し、参照カウントにメモリ管理を任せます。より多くの情報を積極的に取得したり、変数の値を解放するように制御したりする場合は、 isset() 関数と unset() 関数を使用できます。
上記では、PHP のガベージ コレクション メカニズム (コピーオンライトと参照カウント) を、その側面も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。