まず第一に、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出力:
90808-90808 = 0、つまり、これらの 32 バイトは によって与えられます。出力関数が占有されます (厳密には、出力ヘッダーによって占有されます)増加するだけで減少しない配列
ハッシュテーブルは PHP の中核構造です (ハッシュテーブルを理解するには、詳細については以前の記事を参照してください) PHP 配列 (走査順序) の理解)、配列も彼女によって表現され、シンボル テーブルも連想配列です。 100 個の変数を定義し、[Unset them] を押して、出力を見てみましょう:
string(43) "I am php.cn" int(90808) //赋值前 int(90976) int(90808) //是的, 内存正常释放
わぁ、メモリがこんなに少ないのはなぜですか?
これは、Hashtable の定義時に、メモリを割り当てることが不可能であるためです。未知の要素を保存するのに十分なメモリ ブロックが一度に必要なため、PHP は初期化中にメモリ ブロックのごく一部のみを HashTable に割り当て、十分でない場合は RESIZE して容量を拡張します。一方、上記の例では、100 個の変数を保存したときに、シンボル テーブルが不十分で、これらの 100 個の変数の設定を解除すると、メモリが占有されてしまいます。変数は解放されました (118848 – 104448) が、シンボル テーブルは縮小されなかったので、シンボル テーブル自体が占有するメモリは少なくなりました...さて、PHP のメモリ管理についての予備的な理解はできましたか?
以上がunset が PHP でメモリを解放するとどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。