Maison  >  Article  >  développement back-end  >  Comment PHP gère la mémoire

Comment PHP gère la mémoire

(*-*)浩
(*-*)浩original
2019-09-20 11:59:481806parcourir

La gestion de la mémoire comprend généralement les éléments suivants :

Comment PHP gère la mémoire

S'il y a suffisamment de mémoire pour l'utilisation de notre programme ;

Comment obtenir une partie de la mémoire à partir d'une quantité suffisante de mémoire disponible ;

Pour la mémoire utilisée, si elle peut être détruite et réaffectée à d'autres programmes pour utilisation. (Apprentissage recommandé : Programmation PHP de l'entrée à la maîtrise)

En conséquence, La gestion de la mémoire PHP inclut également un tel contenu, mais ces mémoires sont représentées par des macros dans le noyau ZEND. fourni comme interface pour un usage externe.

Les deux dernières opérations correspondent respectivement à la macro emalloc et à la macro efree, et la première opération peut être détectée en fonction du résultat renvoyé par la macro emalloc.

La gestion de la mémoire de PHP peut être considérée comme hiérarchique. Il est divisé en trois couches : couche de stockage (storage), couche de tas (heap) et couche d'interface (emalloc/efree).

La couche de stockage demande en fait de la mémoire au système via des fonctions telles que malloc() et mmap(), et libère la mémoire demandée via la fonction free(). La couche de stockage s'applique généralement à des blocs de mémoire relativement volumineux.La grande mémoire appliquée ici ne fait pas référence à la mémoire requise par la structure de la couche de stockage, c'est simplement que lorsque la couche de tas appelle la méthode d'allocation de la couche de stockage, elle l'applique. en gros morceaux Le rôle de la couche mémoire et de stockage est de rendre la méthode d’allocation de mémoire transparente pour la couche tas.

Comme le montre l'image, gestionnaire de mémoire PHP. PHP a 4 schémas d'allocation de mémoire dans la couche de stockage : malloc, win32, mmap_anon, mmap_zero. Par défaut, malloc est utilisé pour allouer de la mémoire. Si la macro ZEND_WIN32 est définie, c'est la version Windows et HeapAlloc est appelé pour allouer de la mémoire. les deux schémas de mémoire restants sont de la mémoire anonyme, et le schéma de mémoire de PHP peut être modifié en définissant des variables d'environnement.

Comment PHP gère la mémoire

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;

Garbage collection :

1 Dans la version 5.2 ou antérieure, PHP jugera s'il s'agit d'un déchet en fonction du refcount. value

Si la valeur du refcount est 0, PHP la publiera en tant que déchet

Ce mécanisme de recyclage est défectueux et les variables avec des références circulaires ne peuvent pas être recyclées

Après la version 5.3. Cette version améliore le mécanisme de collecte des ordures

S'il s'avère que le refcount dans un conteneur zval augmente, cela signifie que ce n'est pas une poubelle

S'il s'avère que le refcount dans un conteneur zval est décroissant, s'il diminue à 0, il est directement considéré comme Garbage Collection

S'il s'avère que le refcount dans un conteneur zval diminue et n'a pas été réduit à 0, PHP mettra la valeur dans le tampon comme un objet suspect qui peut ê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