Maison > développement back-end > tutoriel php > Analyse des références et garbage collection en php

Analyse des références et garbage collection en php

不言
Libérer: 2023-04-04 06:20:01
original
1379 Les gens l'ont consulté

Le contenu de cet article concerne l'analyse des références et le garbage collection en PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Chaque variable php est stockée dans un conteneur de variables appelé "zval". Un conteneur de variable zval contient, en plus du type et de la valeur de la variable, deux octets d'informations supplémentaires. Le premier est "is_ref", qui est une valeur booléenne utilisée pour identifier si cette variable appartient à l'ensemble de référence. Grâce à cet octet, le moteur PHP peut distinguer les variables ordinaires des variables de référence. Puisque PHP permet aux utilisateurs d'utiliser des références personnalisées en utilisant &, il existe également un mécanisme de comptage de références interne dans le conteneur de variables zval pour optimiser l'utilisation de la mémoire. Le deuxième octet supplémentaire est "refcount", qui est utilisé pour indiquer le nombre de variables (également appelées symboles) pointant vers ce conteneur de variables zval. Tous les symboles existent dans une table de symboles, où chaque symbole a une portée (scope), le script principal (par exemple : le script demandé via le navigateur) et chaque fonction ou méthode ont également une portée.

//Les objets en php sont passés par référence

is_ref = 0, refcount = 0 Le conteneur zval sera détruit à la fin de l'exécution du script

Citer l'exemple officiel

<?php
$a = array( &#39;one&#39; );
$a[] =& $a;
xdebug_debug_zval( &#39;a&#39; );
Copier après la connexion
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

自引用(curcular reference,自己是自己的一个元素)的数组的zval

L'exécution d'unset$a libérera l'association mémoire entre la variable et zval, mais la boucle fermée elle-même existe toujours

(refcount=1, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)=&#39;one&#39;,
   1 => (refcount=1, is_ref=1)=...
)
Copier après la connexion

Zvals after removal of array with a circular reference demonstrating the memory leak

Mais pour le moment, aucune variable ne peut être manipulée dans le conteneur zval. Pour le moment, elle est devenue un déchet de mémoire et ne peut pas l'être. publié

Mécanisme de recyclage : en termes simples, c'est-à-dire qu'après l'exécution du script, toutes les données globales des variables qui existent encore seront refcount -1. Si elles sont réduites à 0, elles seront considérées comme des ordures. et le conteneur de mémoire sera détruit

Recommandations associées :

Déchets PHP Quel type de déchets peut être recyclé par le mécanisme de recyclage ? Quels déchets ne peuvent pas être recyclés ?

Mécanisme de récupération de place PHP : connaissances de base du comptage de références

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:php.cn
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