ホームページ > バックエンド開発 > PHPチュートリアル > PHP で設定を解除するとメモリが解放されるかどうかを分析する_PHP チュートリアル

PHP で設定を解除するとメモリが解放されるかどうかを分析する_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:00:51
オリジナル
942 人が閲覧しました

まず例を見てみましょう

コードをコピーします コードは次のとおりです:

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 レベルでメモリについて議論するのは無意味であるとさえ言う人もいます。

それでは、設定を解除するとメモリが解放されるのでしょうか?
この質問に答えるには、次の 2 つの側面から始めます:
これらの 32 バイトはどこに行ったのでしょうか?


まず、次のことを行う必要があります。考えを壊しましょう: PHP は C 言語とは異なります。メモリ割り当て関連の API を明示的に呼び出した場合にのみメモリ割り当てが発生します。つまり、PHP では目に見えないメモリ割り当てがたくさんあります。例:

コードをコピーします

コードは次のとおりです: $a = "laruence";


暗黙的なメモリ割り当てポイントは次のとおりです:

1は変数名です。シンボルテーブルに保存します
2. 変数値にメモリを割り当てます
したがって、見た目だけを見てはいけません

第二に、
PHP の unset が実際にメモリを解放することを疑ってはいけません。また、reference および counting と組み合わせる必要があります。記事のこの部分については以前の記事 (変数分離/参照の PHP 原則の詳細な理解) を参照してください。ただし、このリリースは C プログラミングの意味でのリリースではありません。
PHP の場合、メモリ割り当て用の C 言語に似た一連のメモリ管理 API が提供されます。これらの API は、C API の意味に対応します。これらの API を通じて PHP で内部管理されます。
emalloc を呼び出してメモリを申請するとき、PHP は単に OS にメモリを要求するのではなく、OS に大きなメモリ ブロックを要求し、その一部を申請者に割り当てます。これにより、メモリを申請するロジックが存在します。メモリを確保するため、OS からメモリを申請する必要がなく、頻繁なシステム コールが回避されます


コードをコピーします
コードは次のとおりです:

var_dump(memory_get_usage( true_size int(262144) int(262144)
int(262144
)
つまり、変数 $a を定義すると、PHP はシステムからの新しいメモリを適用しません。

同様に、メモリを解放するために efree を呼び出すと、PHP はメモリを OS に返しませんが、このメモリを自身が保持する空きメモリ リストに追加します。メモリが小さい場合は、そのメモリを追加する可能性が高くなります。メモリ キャッシュ リスト (追記、私が確認した PHP5.2.4、5.2.6、5.2.8 などの PHP の一部のバージョンでは、get_memory_usage() を呼び出すときにメモリが減算されません。 キャッシュ リスト内の使用可能なメモリ ブロックのサイズ、設定を解除した後もメモリが変更されていないように見えます)。

ここで、これらの 32 バイトがどこに配置されるかについて答えましょう。先ほど述べたように、多くのメモリ割り当てプロセスは明示的ではありません。


コードをコピーする

コードは次のとおりです。 ️ ()) ;
unset($a);

var_dump(memory_get_usage());


出力:
string(43) "I am www.jb51.net"
int(90808) //割り当て前
int(90976)
int(90808) //はい、メモリは正常に解放されます

90808-90808 = 0、通常、つまり、この 32 バイトは出力関数によって占有されます (厳密に言うと、出力ヘッダーによって占有されます)

増加するだけで減少しない配列
ハッシュテーブルこれは PHP の核となる構造です (Hashtable を理解するには、配列 (走査順序) を理解するための私の以前の記事を参照してください)。また、次のコードでは、シンボル テーブルも連想配列です。 :

コードをコピーします コードは次のとおりです:

var_dump("I am www.jb51.net");
var_dump(memory_get_usage());
$array = array_fill(1, 100, "laruence");
foreach ( $array as $key => $value) {
${$value . $key} = NULL
}
foreach ($array as $key); => $value) {
unset(${$value . $key});
}
var_dump(memory_get_usage());

100 個の変数を定義し、[Unset] をクリックして出力を確認しました。 43) 「私は www.jb51.net です」
int(93560)
int(118848)
int(104448
)
わあ、なぜメモリがこんなに少ないのですか?

これは、Hashtable を定義するときに、未知の数の要素を保存するのに十分なメモリ ブロックを一度に割り当てることが不可能であるためです。そのため、PHP はそれを初期化します。メモリブロックのごく一部を HashTable に割り当て、足りない場合は RESIZE して容量を拡張するだけです。
ハッシュテーブルは拡張のみ可能で、縮小はできません。上記の例では、100 個の変数を保存したときに、シンボル テーブルが不十分だったので拡張を行い、これらの 100 個の変数の設定を順番に解除すると、変数によって占有されていたメモリが減りました。が解放されますが(118848 – 104448)、シンボルテーブルは削減されないため、小さなメモリがシンボルテーブル自体によって占有されます...

さて、PHP のメモリ管理について予備的な理解はできましたか?

http://www.bkjia.com/PHPjc/328036.html

tru​​ehttp://www.bkjia.com/PHPjc/328036.html技術記事まず、次のようにコードをコピーする例を見てみましょう。 $a = "laruence" var_dump(memory_get_usage()); .
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート