まず第一に、PHP で設定を解除するとメモリが解放されますか?
まず、例を見てみましょう:
var_dump(memory_get_usage()); $a = "laruence"; var_dump(memory_get_usage()); unset($a); var_dump(memory_get_usage());
出力 (異なるパーソナルコンピューターでは、システム、PHP バージョン、ロードされた拡張機能によって異なる場合があります)それぞれ異なります):
int(90440) int(90640) int(90472
気づいた 90472-90440=32 ということで、PHP の unset は実際にはメモリを解放しないという人もいますし、PHP の unset だけでメモリが本当に解放されるだけだという人もいます。大きな変数 (大量の 文字列、大きな配列) が解放されたとき、PHP レベルでメモリについて議論するのは無意味だとさえ言う人もいます
それでは、これらの 32 バイトはどこに行くのでしょうか?
この質問に答えるために、次の 2 つの側面から始めます:
これらの 32 バイトはどこに行ったのか
まず第一に 私たちは考え方を打ち破らなければなりません: PHP は C 言語とは異なり、表示するだけです メモリ割り当ては呼び出しによってのみ発生します
メモリ割り当て関連の API
つまり、PHP には、目に見えないメモリ割り当てプロセスがたくさんあります
$a = "laruence";
たとえば、次の例のように、OS にメモリを要求する必要はありません。
ログイン後にコピー
つまり、変数 を定義するときです。 $a、PHP はシステムからの新しいメモリを適用しません。
同様に、メモリを解放するために efree を呼び出すと、PHP はメモリを OS に返しませんが、このメモリを OS が保持する空きメモリ リストに追加します。メモリの小さな部分、それはメモリキャッシュリストに入れられる可能性があります(追記、私が確認したPHPの一部のバージョン(PHP5.2.4、5.2.6、5.2.8など)は呼び出し時に減少しません) get_memory_usage() メモリ キャッシュ リスト内の使用可能なメモリ ブロック サイズに移動すると、設定解除後もメモリが変更されていないように見えます)。それでは、これらの 32 バイトがどこに行ったのか答えましょう。先ほど言ったように、大量のメモリです。割り当てプロセスは明示的ではありません。次のコードを読むと理解できます:
int(262144) int(262144) int(262144
出力:
ログイン後にコピー
増加するだけで減少しない配列
ハッシュテーブルは PHP の中核構造です (ハッシュテーブルを理解するには、詳細については以前の記事を参照してください) PHP 配列 (走査順序) の理解)、配列も彼女によって表現され、シンボル テーブルも連想配列です。 100 個の変数を定義し、[Unset them] を押して、出力を見てみましょう:string(43) "I am php.cn" int(90808) //赋值前 int(90976) int(90808) //是的, 内存正常释放
さて、PHP のメモリ管理についての予備的な理解はできましたか?
以上がunset が PHP でメモリを解放するとどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。