Maison  >  Article  >  développement back-end  >  Expliquer en détail le mécanisme de récupération de place PHP à travers des exemples

Expliquer en détail le mécanisme de récupération de place PHP à travers des exemples

王林
王林avant
2019-08-29 13:55:312951parcourir

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

1. PHP peut gérer automatiquement la mémoire et effacer les objets inutiles, principalement en utilisant le comptage de références

2 . sont définis dans la structure zval. ref_count est un nombre de références, qui identifie le nombre de variables référencées par ce zval. Lorsqu'il est égal à 0, il sera détruit. is_ref identifie si le caractère d'adresse & est utilisé pour forcer une référence

3. Afin de résoudre le problème des fuites de mémoire de référence circulaire, un algorithme de recyclage de cycle synchrone est utilisé.

Par exemple, lorsqu'un tableau ou un objet se réfère cycliquement à lui-même et désactive le tableau, si refcount-1 est toujours supérieur à 0, il sera considéré comme un déchet suspecté, parcouru et simulé la suppression de refcount-1. S'il est 0, supprimez-le. S'il n'est pas 0, restaurez le processus de génération des déchets tenaces :

<?php
    $a = "new string";
?>
a: (refcount_gc=1, is_ref_gc=0)=&#39;new string&#39;

Lorsque $a est affecté à une autre variable, le refcount_gc du zval correspondant à $a sera augmenté. par 1

<?php
    $a = "new string";
    $b = $a;
?>

À ce moment, les informations de stockage interne correspondant aux variables $a et $b sont, $a et $b pointent vers une chaîne "nouvelle chaîne" en même temps, et son refcount devient 2a,b : (refcount_gc=2,is_ref= 0)='new string'

Lorsque unset est utilisé pour supprimer la variable $b, le refcount_gc de "new string" sera réduit de 1 et deviendra 1

Pour les variables ordinaires, tout ça C'est normal, mais dans les variables de type composite (tableaux et objets), quelque chose de plus intéressant se produira :

<?php
    $a = array(&#39;meaning&#39; => &#39;life&#39;, &#39;number&#39; => 42);
?>

$a Les informations de stockage interne sont :

a: (refcount=1, is_ref=0)=array (
&#39;meaning&#39; => (refcount=1, is_ref=0)=&#39;life&#39;,
&#39;number&#39; => (refcount=1, is_ref=0)=42
)

Variable de tableau elle-même ($a) À l'intérieur du moteur se trouve en fait une table de hachage. Il y a deux éléments zval signifiant et numérotant dans ce tableau, donc en fait un total de 3 zvals sont générés dans cette ligne de code. 3 zvals suivent tous les principes de référence et de comptage des variables. Utilisation Le diagramme montre :

Expliquer en détail le mécanisme de récupération de place PHP à travers des exemples

Ensuite, ajoutez un élément à $a et attribuez la valeur d'un élément existant au nouvel élément :

<?php
    $a = array(&#39;meaning&#39; => &#39;life&#39;, &#39;number&#39; => 42);
    $a[&#39;name&#39;] = $a[&#39;meaning&#39;];
 ?>

Ensuite, le stockage interne de $a est, le ref_count de "life" devient 2, et le ref_count de 42 est 1 :

a: (refcount=1, is_ref=0)=array (
&#39;meaning&#39; => (refcount=2, is_ref=0)=&#39;life&#39;,
&#39;number&#39; => (refcount=1, is_ref=0)=42,
&#39;name&#39; => (refcount=2, is_ref=0)=&#39;life&#39;
)

Si vous attribuez la référence du tableau à un élément du tableau, des choses intéressantes se produiront :

<?php
    $a = array(&#39;one&#39;);
    $a[] = &$a;
?>

De cette façon, le tableau $a a deux éléments, l'un avec un indice de 0 et une valeur du caractère un, et l'autre avec un index de 1, qui est une référence à $a lui-même. Le stockage interne est le suivant :

Expliquer en détail le mécanisme de récupération de place PHP à travers des exemples

a: (refcount=2, is_ref=1)=array (
0 => (refcount=1, is_ref=0)=&#39;one&#39;,
1 => (refcount=2, is_ref=1)=…
)

array Le ref_count de zval est 2, qui est une référence circulaire. . A ce moment, $a n'est pas défini, puis $a sera supprimé de la table des symboles, et le refcount_gc du zval pointé par $a est réduit de 1.

Ensuite, le problème se pose, $a est n'est plus dans la table des symboles, l'utilisateur Cette variable n'est plus accessible, mais le refcount_gc du zval pointé par $a devient 1 au lieu de 0, il ne peut donc pas être recyclé, entraînant une fuite de mémoire. le nouveau GC est de nettoyer ces déchets.

Afin de résoudre le problème des fuites de mémoire de référence circulaire, un algorithme de recyclage de cycle synchrone est utilisé. Si le ref_count est réduit de 1 et est toujours supérieur à 0, il sera considéré comme un déchet suspect.

Par exemple, lorsqu'un tableau ou un objet se réfère cycliquement à lui-même et désactive le tableau, si refcount-1 est toujours supérieur à 0, il sera parcouru et simulé pour être supprimé. Si refcount-1 est 0, il sera supprimé. S'il n'est pas 0, restaurez-le.

Pour plus de contenu connexe, veuillez visiter le site Web PHP chinois : Tutoriel vidéo PHP

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer