ホームページ  >  記事  >  バックエンド開発  >  PHP がメモリを管理する方法

PHP がメモリを管理する方法

(*-*)浩
(*-*)浩オリジナル
2019-09-20 11:59:481793ブラウズ

メモリ管理には通常、次の内容が含まれます。

PHP がメモリを管理する方法

プログラムの使用に十分なメモリがあるかどうか。

利用可能な十分なメモリからメモリの一部を取得する方法;

使用済みメモリについて、破棄して他のプログラムに再割り当てして使用できるかどうか。 (推奨学習: PHP プログラミングの入門から熟練度まで )

これに対応して、PHP のメモリ管理にもそのようなコンテンツが含まれていますが、これらのメモリは ZEND カーネルのマクロの形式になっています。フォームは外部使用のためのインターフェースとして提供されます。

後の 2 つの操作は、それぞれ emalloc マクロと efree マクロに対応しており、最初の操作は emalloc マクロによって返された結果に基づいて検出できます。

PHP のメモリ管理は階層的に見ることができます。ストレージ層(storage)、ヒープ層(heap)、インターフェース層(emalloc/efree)の3つの層に分かれています。

ストレージ層は実際には、malloc() や mmap() などの関数を通じてシステムからメモリを適用し、free() 関数を通じて要求されたメモリを解放します。ストレージ層は通常、比較的大きなメモリ ブロックに適用されます。ここで適用される大容量メモリとは、ストレージ層の構造に必要なメモリのことではありません。ヒープ層がストレージ層の割り当てメソッドを呼び出すときに適用されるだけです。メモリ層とストレージ層の役割は、メモリ割り当て方法をヒープ層に対して透過的にすることです。

図に示すように、PHP メモリ マネージャー。 PHP には、ストレージ層に 4 つのメモリ割り当てスキームがあります: malloc、win32、mmap_anon、mmap_zero。デフォルトでは、malloc がメモリの割り当てに使用されます。ZEND_WIN32 マクロが設定されている場合、それは Windows バージョンであり、メモリを割り当てるために HeapAlloc が呼び出されます。残りの 2 つのメモリ スキームは匿名メモリであり、マッピングと PHP のメモリ スキームは環境変数を設定することで変更できます。

PHP がメモリを管理する方法

PHP内存管理机制
var_dump(memory_get_usage());   //获取内存
$a = "laruence";                //定义一个变量
var_dump(memory_get_usage());   //定义变量之后获取内存
unset($a);                      //删除该变量
var_dump(memory_get_usage());   //删除变量后获取内存

从上面可以看出php的内存管理机制是:预先给出一块空间,用来存储变量,当空间不够时,再申请一块新的空间。

1.存储变量名,存在符号表。

2.变量值存储在内存空间。

3.在删除变量的时候,会将变量值存储的空间释放,而变量名所在的符号表不会减小。

var_dump(memory_get_usage());  //获取内存
//定义100个变量
for($i=0;$i<100;$i++)
{
    $a = "test".$i;
    $$a = "hello";
}
//获取定义100个变量之后的内存
var_dump(memory_get_usage());
//定义100个变量并删除
for($i=0;$i<100;$i++)
{
    $a = "test".$i;
    unset($$a);
}
//获取删除之后的内存
var_dump(memory_get_usage());


从上面可以看出,虽然删除后内存变小了,但还是比没定义变量之前时大,这是因为虽然删除了变量的值,但变量名没有被删除。

php垃圾回收机制

PHP变量存储是存储在一个zval容器里面的

1.类型 2.值 3.is_ref 代表是否有地址引用 4.refcount 指向该值的变量数量

1.变量赋值的时候:is_ref为false  refcount为1

$a = 1;
xdebug_debug_zval(&#39;a&#39;);
echo PHP_EOL;

2.将变量a的值赋给变量b,变量b不会立刻去在内存中存储值,而是先指向变量a的值,一直到变量a有任何操作的时候

$b = $a;
xdebug_debug_zval(&#39;a&#39;);
echo PHP_EOL;

3.因为程序又操作了变量a,所以变量b会自己申请一块内存将值放进去。所以变量a的zavl容器中refcount会减1变为1,变量c指向a,所以refcount会加1变为2

$c = &$a;
xdebug_debug_zval(&#39;a&#39;);
echo PHP_EOL;
xdebug_debug_zval(&#39;b&#39;);
echo PHP_EOL;

ガベージ コレクション:

1. バージョン 5.2 以前では、PHP は refcount に基づいてガベージかどうかを判断します。 value

refcount 値が 0 の場合、PHP はそれをガベージとして解放します

このリサイクル メカニズムには欠陥があるため、循環参照を持つ変数はリサイクルできません

2。 5.3 このバージョンでは、ガベージ コレクション メカニズムが改善されています。

zval コンテナ内の refcount が増加していることが判明した場合、それはガベージではないことを意味します。

zval コンテナ内の refcount が増加していることが判明した場合は、コンテナが減少しています。0 に減少した場合は、直接ガベージ コレクションとみなされます。

zval コンテナ内の refcount が減少しており、0 に減少していないことが判明した場合、PHP は値を設定します。ガベージの可能性がある疑わしいオブジェクトとしてバッファに保存されます。

バッファーが臨界値に達すると、PHP は自動的にメソッドを呼び出して各値を調べ、値がガベージであることが判明した場合は消去します。

以上がPHP がメモリを管理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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