Maison  >  Article  >  développement back-end  >  Explication détaillée du mécanisme de récupération de place PHP et de gestion de la mémoire

Explication détaillée du mécanisme de récupération de place PHP et de gestion de la mémoire

零到壹度
零到壹度original
2018-03-20 09:24:511738parcourir

Cet article vous présente principalement les étapes spécifiques et les techniques de fonctionnement associées du mécanisme de récupération de place PHP et de gestion de la mémoire. Les amis dans le besoin peuvent s'y référer. J'espère qu'il pourra vous aider.

Mécanisme de gestion de la mémoire

<span style='font-family: 微软雅黑, "Microsoft YaHei";'>1 var_dump(memory_get_usage());   //获取内存<br>2 $a = "laruence";                //定义一个变量<br>3 var_dump(memory_get_usage());   //定义变量之后获取内存<br>4 unset($a);                      //删除该变量<br>5 var_dump(memory_get_usage());   //删除变量后获取内存<br></span>


Comme le montre ce qui précède, le mécanisme de gestion de la mémoire de PHP est le suivant : donnez un espace à l'avance pour stocker les variables, et lorsque l'espace n'est pas suffisant, demandez un nouvel espace.

1. Stockez les noms de variables et disposez de tables de symboles.

2. Les valeurs des variables sont stockées dans l'espace mémoire.

3. Lors de la suppression d'une variable, l'espace où la valeur de la variable est stockée sera libéré, mais la table des symboles où se trouve le nom de la variable ne sera pas réduite.

<span style='font-family: 微软雅黑, "Microsoft YaHei";'>var_dump(memory_get_usage());  //获取内存<br>//定义100个变量for($i=0;$i<100;$i++)<br>{    $a = "test".$i;<br>    $$a = "hello";<br>}//获取定义100个变量之后的内存var_dump(memory_get_usage());//定义100个变量并删除for($i=0;$i<100;$i++)<br>{    $a = "test".$i;    unset($$a);<br>}//获取删除之后的内存var_dump(memory_get_usage());</span>

Comme le montre ce qui précède, bien que la mémoire devienne plus petite après la suppression, elle est toujours plus grande qu'avant la définition de la variable En effet, bien que la valeur de la variable soit supprimée, le nom de la variable n'est pas supprimé.

Mécanisme de récupération de place PHP

Le stockage des variables PHP est stocké dans un conteneur zval

1 . Tapez 2. Valeur 3. is_ref représente s'il existe une référence d'adresse 4. refcount est le nombre de variables pointant vers la valeur

1. est faux et refcount est 1

<span style='font-family: 微软雅黑, "Microsoft YaHei";'>$a = 1;<br>xdebug_debug_zval('a');echo PHP_EOL;</span>

2. Attribuez la valeur de la variable a à la variable b. mémoire immédiatement, mais pointe d'abord la valeur de la variable a jusqu'à ce qu'il y ait une opération sur la variable a

<span style='font-family: 微软雅黑, "Microsoft YaHei";'>$b = $a;<br>xdebug_debug_zval('a');echo PHP_EOL;</span>

3 Parce que le programme fonctionne. à nouveau la variable a, donc la variable b demandera un morceau de mémoire et y mettra la valeur. Par conséquent, le refcount dans le conteneur zavl de la variable a diminuera de 1 et deviendra 1. La variable c pointe vers a, donc le refcount augmentera de 1 et deviendra 2

<span style='font-family: 微软雅黑, "Microsoft YaHei";'>$c = &$a;<br>xdebug_debug_zval('a');echo PHP_EOL;<br>xdebug_debug_zval('b');echo PHP_EOL;<br></span>


Mécanisme de récupération de place

1. Dans la version 5.2 ou antérieure, PHP le fera. juger s'il est basé sur la valeur de refcount Garbage

Si la valeur de refcount est 0, PHP la libérera comme poubelle

Ce mécanisme de recyclage est défectueux, pour les variables avec des références circulaires Impossible de recycler

2 Le mécanisme de récupération de place a été amélioré après la version 5.3

Si le refcount. dans un conteneur zval s'avère augmenter, cela signifie que ce n'est pas une poubelle

S'il s'avère que le refcount dans un conteneur zval diminue, s'il est réduit à 0, il sera directement traité comme un garbage collection

S'il est a constaté que le nombre de refcount dans un conteneur zval diminue et s'il n'est pas réduit à 0, PHP mettra la valeur dans le tampon en tant qu'objet suspect pouvant être un déchet.

Lorsque le tampon atteint la valeur critique, PHP appellera automatiquement une méthode pour parcourir chaque valeur et la nettoiera si elle s'avère être une poubelle

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn