ホームページ  >  記事  >  バックエンド開発  >  PHP ガベージ コレクション メカニズム ----コピーオンライトと参照カウント

PHP ガベージ コレクション メカニズム ----コピーオンライトと参照カウント

WBOY
WBOYオリジナル
2016-08-08 09:25:211121ブラウズ

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 チュートリアルに興味のある友人に役立つことを願っています。

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