ホームページ  >  記事  >  バックエンド開発  >  unset が PHP でメモリを解放するとどうなりますか?

unset が PHP でメモリを解放するとどうなりますか?

伊谢尔伦
伊谢尔伦オリジナル
2017-06-24 09:54:181832ブラウズ

まず第一に、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";

暗黙的なメモリ割り当てポイントは次のとおりです: 1. 変数にメモリを割り当てます。名前
を指定し、それをシンボルテーブルに保存します
2. 変数値にメモリを割り当てます
したがって、見た目だけを見てはいけません第二に、
PHP の unset によって実際にメモリが解放されることを疑ってはいけません (もちろん、また、参照とカウントを組み合わせるには、PHP の原則 (変数の分離/参照) を深く理解するために私の以前の記事を参照してください。ただし、このリリースは C プログラミングの意味でのリリースではなく、引き戻されません。

PHP の場合、メモリ割り当てのための C 言語に似た一連のメモリ管理 API が提供されます。これらの API は、PHP でこれらの API を介して内部的に管理されます。 emalloc を使用してメモリを適用する場合、PHP は単に OS にメモリを要求するのではなく、メモリを適用するロジックがある場合、OS に大きなメモリ ブロックを要求し、その一部を申請者に割り当てます。


たとえば、次の例のように、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 サイトの他の関連記事を参照してください。

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