まず問題を見てみましょう: 次のコードの出力です。
コードをコピーします コードは次のとおりです:
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 はメモリを解放しているだけだという人もいます。 . メモリが本当に解放されるのは、大きな変数 (多数の文字列、大きな配列) がある場合です。
それでは、メモリを unset すると解放されるのでしょうか?これらの 32 の単語 セクションはどこへ行ったのでしょうか?
この質問に答えるために、次の 2 つの側面から始めます:
これらの 32 バイトはどこへ行ったのでしょうか? まず第一に、PHP は C 言語とは異なりますという考えを打ち破る必要があります。 , 表示したもののみ メモリ割り当ては、メモリ割り当てに関連する API が呼び出されたときにのみ発生します つまり、PHP では、目に見えないメモリ割り当てプロセスがたくさんあります
例:
$a = "larence. ";
暗黙的 メモリ割り当てポイントは次のとおりです:
1.1. 変数名にメモリを割り当て、それをシンボル テーブルに格納します
2.2. 変数値にメモリを割り当てます したがって、単に見ることはできません。
第 2 に、PHP の unset が実際に行われることを疑ってはいけません。メモリは解放されますが、この解放は C プログラミングの意味での解放ではなく、OS には戻されません。
PHP の場合は、メモリ割り当て用の C 言語に似たメモリ管理 API のセット:コードをコピー
コードは次のとおりです:emalloc(size_t size);
efree(void *ptr);
ecalloc(size_t nmemb , size_t size);
erealloc(void *ptr, size_t size);
estrdup(const char * s);
estrndup(const char *s, unsigned int length);
これらの API は、C の API の意味に対応します。メモリは、これらの API を通じて PHP 内で管理されます。
emalloc を呼び出してメモリを適用すると、PHP は単に OS にメモリを要求するのではなく、OS に大きなメモリ ブロックを要求し、その一部をメモリに割り当てます。このようにして、メモリを適用するロジックがある場合、OS にメモリを要求する必要がなく、頻繁なシステム呼び出しを回避できます
例:
コードは次のとおりです: var_dump(memory_get_usage(TRUE)) //取得に注意してください。 is real_size
$a = "laruence";
var_dump(memory_get_usage(TRUE));
unset ($a);
var_dump(memory_get_usage(TRUE));
Output:
int(262144)
int(262144)
int(262144)
つまり、変数 $a を定義すると、PHP は適用されません。同様に、メモリを解放するために efree を呼び出すと、PHP はメモリを OS に返さず、その代わりに、このメモリを、小規模なメモリに対して保持する空きメモリ リストに追加します。メモリ キャッシュ リストに追加される可能性が高くなります (追記、私の検証など、PHP の一部のバージョンでは、get_memory_usage() を呼び出すときに、使用可能なメモリ ブロック サイズがメモリ キャッシュ リストは減算されないため、設定解除後もメモリが変更されていないように見えます。
ここで、これらの 32 バイトがどこに行くのか答えましょう。先ほど述べたように、多くのメモリ割り当てプロセスは明示的ではないことが理解できるでしょう。次のコードを読んだ後:
コードをコピー
コードは次のようになります:
var_dump("I am Laruence, From http://www.laruence.com");var_dump(memory_get_usage ());
$a = "ラルエンス";
var_dump(memory_get_usage ());
unset($a);
var_dump(memory_get_usage());
出力:
string(43) "私はラルエンスです、http から://www.laruence.com"
int(90808) // 代入前
int(90976)
int(90808) //はい、メモリは正常に解放されます
90808-90808 = 0、これは正常です、つまりつまり、これらの 32 バイトは出力関数によって占有されます (厳密に言えば、出力ヘッダによって占有されます)
増加するだけで減少しない配列
配列も PHP の中心的な構造です。次のコードの場合:
コードをコピーします コードは次のとおりです:
var_dump("私はラルエンスです、http://www.laruence.com より");
var_dump(memory_get_usage());
$array = array_fill(1, 100, "laruence");
foreach ($array as $key => $value) {
${$value . $key} = NULL;
}
var_dump(memory_get_usage());
foreach ($array as $key=> $value) {
unset( ${$value . $key});
}
var_dump(memory_get_usage());
100 個の変数を定義し、[Unset] をクリックして設定を解除しました。出力を見てみましょう。 code
コードは次のとおりです: string(43) "私は Laruence、http://www.laruence.com からです"int(93560)
int(118848)
int(104448)
すごい、なぜメモリがたくさんあるのでしょう?
これは、Hashtable を定義するときに、未知の数の要素を保存するのに十分なメモリ ブロックを一度に割り当てることが不可能であるため、PHP は初期化中に 1 つのみを割り当てます。メモリ ブロックの一部が HashTable に与えられ、足りない場合は RESIZE によって拡張されます。上記の例では、100 個の変数を格納すると、シンボル テーブルは拡張されます。十分ではなかったので、拡張を実行し、100 個の変数の設定を順番に解除すると、変数によって占有されていたメモリは解放されました (118848 – 104448)。しかし、シンボル テーブルは縮小されず、小さなメモリがシンボル テーブルによって占有されました。 …
さて、PHP のメモリ管理について予備的な理解はできましたか?
http://www.bkjia.com/PHPjc/327674.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/327674.html技術記事まず問題を見てみましょう。次のコードの出力を次のようにコピーします。 $a = "laruence" var_dump(memory_get_usage());も...