PHP のメモリ管理メカニズム
var_dump(memory_get_usage()); //获取内存 $a = "laruence"; //定义一个变量 var_dump(memory_get_usage()); //定义变量之后获取内存 unset($a); //删除该变量 var_dump(memory_get_usage()); //删除变量后获取内存
出力結果:
int 262144 int 262144 int 262144
上記のことから、PHP のメモリ管理メカニズムは次のとおりであることがわかります。あらかじめ与えられた変数を格納するためのスペースを作成し、スペースが足りない場合は新たにスペースを申請します。
1. 変数名を保存し、シンボル テーブルを持ちます。
2. 変数の値はメモリ空間に保存されます。
3. 変数を削除すると、変数の値が格納されている領域は解放されますが、変数名が格納されているシンボル テーブルは減りません。
var_dump(memory_get_usage()); //获取内存 //定义100个变量 for($i=0;$i<100;$i++) { $a = "test".$i; $$a = "hello"; } //获取定义100个变量之后的内存 var_dump(memory_get_usage()); //定义100个变量并删除 for($i=0;$i<100;$i++) { $a = "test".$i; unset($$a); } //获取删除之后的内存 var_dump(memory_get_usage());
出力結果:
int 240040 int 257680 int 240856
上記からわかるように、削除後はメモリが小さくなりますが、変数定義前よりはまだ大きいことがわかります。これは、変数の値は削除されますが、変数名は削除されないためです。
php ガベージ コレクション メカニズム
PHP 変数ストレージは zval コンテナに格納されます
1. 型 2. 値 3. is_ref はアドレス参照があるかどうかを表します 4. refcount値を指す変数の数
1。変数に値を代入する場合: is_ref は false、refcount は 1
$a = 1; xdebug_debug_zval('a');echo PHP_EOL;
2 です。変数 a の値を変数 b に変換する場合、変数 b はその値をすぐにメモリに保存しませんが、変数 a
$b = $a; xdebug_debug_zval('a');echo PHP_EOL;# に対する操作が行われるまで、まず変数 a の値を指します。 #3 .プログラムは変数 a を再度操作するため、変数 b がメモリの一部に適用され、その値が格納されます。したがって、変数 a の zavl コンテナ内の refcount は 1 減って 1 になります。変数 c は a を指すため、refcount は 1 増えて 2.
$c = &$a; xdebug_debug_zval('a');echo PHP_EOL; xdebug_debug_zval('b');echo PHP_EOL;
になります。
ガベージ コレクション:
1. バージョン 5.2 以前では、PHP は refcount 値に基づいてガベージかどうかを判断します。 0 では、PHP はガベージとしてリリースします。このリサイクル メカニズムに欠陥があるため、循環参照を持つ変数はリサイクルできません#2。ガベージ コレクション メカニズムは 5.3 以降のバージョンで改善されました
zval コンテナ内の refcount が増加していることが判明した場合は、それがガベージではないことを示します
zval コンテナ内の refcount が減少していることが判明した場合 (0 に減少した場合) 、ガベージ コレクションとして直接処理されます
zval コンテナーの refcount が減少していることが判明した場合、減少していません。0 にすると、PHP はその値を疑わしい候補としてバッファーに入れます。ゴミのオブジェ。
バッファーが臨界値に達すると、PHP は各値を走査するメソッドを自動的に呼び出します。ゴミであることが判明した場合は、クリーンアップします。
その他の関連する質問については、次のリンクを参照してください。 PHP 中国語 Web サイト:
PHP 実践ビデオ チュートリアル以上がPHP のメモリ管理メカニズムとガベージ コレクション メカニズムとは何ですか?それを理解するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。