Maison > développement back-end > tutoriel php > 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

王林
Libérer: 2023-04-07 10:58:02
avant
3004 Les gens l'ont consulté

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";
?>
Copier après la connexion
a: (refcount_gc=1, is_ref_gc=0)=&#39;new string&#39;
Copier après la connexion

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

<?php
    $a = "new string";
    $b = $a;
?>
Copier après la connexion

À 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

Copier après la connexion

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);
?>
Copier après la connexion

$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
)
Copier après la connexion

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;];
 ?>
Copier après la connexion

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;
)
Copier après la connexion

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;
?>
Copier après la connexion

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)=…
)
Copier après la connexion

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!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal