Maison >développement back-end >Problème PHP >Qu'est-ce que le mécanisme de gestion de la mémoire PHP et le mécanisme de garbage collection ?
Mécanisme de gestion de la mémoire PHP
var_dump(memory_get_usage()); //获取内存 $a = "laruence"; //定义一个变量 var_dump(memory_get_usage()); //定义变量之后获取内存 unset($a); //删除该变量 var_dump(memory_get_usage()); //删除变量后获取内存
Résultat de sortie :
int 262144 int 262144 int 262144
Comme le montre ce qui précède, le mécanisme de gestion de la mémoire de PHP est : pré-donné Créer un espace pour stocker les variables Lorsque l'espace n'est pas suffisant, demander 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.
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());
Résultat de sortie :
int 240040 int 257680 int 240856
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 que la variable ne soit pas définie 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 Type 2. Valeur 3. is_ref représente s'il existe une référence d'adresse 4. refcount. Le nombre de variables pointant vers la valeur
1 Lors de l'attribution d'une variable : is_ref est faux et refcount est 1
$a = 1; xdebug_debug_zval('a');echo PHP_EOL;
2. variable a à variable b, la variable b ne stockera pas la valeur dans la mémoire immédiatement, mais pointe d'abord vers la valeur de la variable a jusqu'à ce qu'il y ait une opération sur la variable a
$b = $a; xdebug_debug_zval('a');echo PHP_EOL;
3. Parce que le programme exploite à nouveau la variable a, 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, et la variable c pointe vers a, donc le refcount augmentera de 1 et deviendra 2
$c = &$a; xdebug_debug_zval('a');echo PHP_EOL; xdebug_debug_zval('b');echo PHP_EOL;
Collecte des déchets :
1. Dans la version 5.2 ou antérieure, PHP jugera s'il s'agit d'un déchet en fonction de la valeur refcount
Si la valeur refcount est 0. , PHP le publiera comme poubelle
Ce mécanisme de recyclage est défectueux et les variables avec des références circulaires ne peuvent pas être recyclées
2 Le mécanisme de collecte des ordures a été amélioré dans les versions après 5.3
<.>S'il s'avère que le refcount dans un conteneur zval augmente, indiquant qu'il ne s'agit pas d'une poubelleS'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 collectionS'il s'avère que le nombre de refcount dans un conteneur zval diminue, il n'a pas été diminué à 0, PHP mettra la valeur dans le tampon comme objet suspect possible de. ordures. Lorsque le tampon atteint la valeur critique, PHP appellera automatiquement une méthode pour parcourir chaque valeur. S'il s'avère qu'il s'agit d'un déchet, nettoyez-le. Pour plus de questions connexes, veuillez visiter le site. Site Web PHP chinois :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!