Ce que cet article vous apporte est une introduction au mécanisme de collecte des ordures (exemples de code) des principes sous-jacents de PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. .
Le mécanisme de récupération de place php est un contenu familier mais pas très familier pour PHPer. Alors, comment PHP recycle-t-il la mémoire inutile ?
La structure de stockage interne des variables PHP
Tout d'abord, vous devez comprendre les connaissances de base pour faciliter la compréhension des principes du garbage collection. Tout le monde sait que php est écrit en C, donc la structure de stockage interne des variables php sera également liée au langage C, c'est-à-dire la structure de zval :
struct _zval_struct { union { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; zend_object_value obj; zend_ast *ast; } value; //变量value值 zend_uint refcount__gc; //引用计数内存中使用次数,为0删除该变量 zend_uchar type; //变量类型 zend_uchar is_ref__gc; //区分是否是引用变量 };
On peut le voir dans le contenu de la structure ci-dessus que chaque variable PHP sera composée de quatre parties : type de variable, valeur, nombre de références et s'il s'agit d'une variable de référence
Remarque : la structure zval ci-dessus est la structure après la version PHP5.3, car il n'a pas été introduit avant PHP5.3. Le nouveau mécanisme de récupération de place est GC, donc il n'y a pas de _gc dans le nom et après la version php7, la structure zval a été réécrite en raison de problèmes de performances, et le
le principe du comptage de références n'est plus énoncé ici
Compréhension Après la structure de stockage interne des variables PHP, nous découvrirons les principes liés à l'affectation des variables PHP et au premier mécanisme de récupération de place
Conteneur de variables
Variables non-tableaux et objets
Chaque fois lors de l'attribution d'une constante à une variable, un conteneur de variable
sera généré. Exemple :
$a = '许铮的技术成长之路'; xdebug_debug_zval('a')
a: (refcount=1, is_ref=0)='许铮的技术成长之路'
$b = [ 'name' => '许铮的技术成长之路', 'number' => 3 ]; xdebug_debug_zval('b')
b: (refcount=1, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 'number' => (refcount=1, is_ref=0)=3)
$a = [ 'name' => '许铮的技术成长之路', 'number' => 3 ]; //创建一个变量容器,变量a指向给变量容器,a的ref_count为1 $b = $a; //变量b也指向变量a指向的变量容器,a和b的ref_count为2 xdebug_debug_zval('a', 'b'); $b['name'] = '许铮的技术成长之路1';//变量b的其中一个元素发生改变,此时会复制出一个新的变量容器,变量b重新指向新的变量容器,a和b的ref_count变成1 xdebug_debug_zval('a', 'b');
a: (refcount=2, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 'number' => (refcount=1, is_ref=0)=3) b: (refcount=2, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 'number' => (refcount=1, is_ref=0)=3) a: (refcount=1, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 'number' => (refcount=1, is_ref=0)=3) b: (refcount=1, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路1', 'number' => (refcount=1, is_ref=0)=3)
写时复制技术
php5.3版本之前的垃圾回收机制
$a = "许铮的技术成长之路"; $b = $a; xdebug_debug_zval('a'); unset($b); xdebug_debug_zval('a');
a: (refcount=2, is_ref=0)='许铮的技术成长之路' a: (refcount=1, is_ref=0)='许铮的技术成长之路'
Par exemple :
Depuis la sortie de cet exemple n'est pas facile, utilisez un schéma pour le représenter, comme le montre la figure :$a = array( 'one' ); $a[] = &$a; xdebug_debug_zval( 'a' );
Exemple :
unset($a); xdebug_debug_zval('a');
Nouveau mécanisme de récupération de place
Critères de confirmation comme garbage
Résumé
2. en même temps, lorsque PHP découvre qu'il existe un zval avec une référence circulaire, il le placera dans le tampon racine. Lorsque le tampon racine atteint le numéro spécifié dans le fichier de configuration, un garbage collection sera effectué pour résoudre la fuite de mémoire provoquée. par références circulaires Problème (php5.3 a commencé à introduire ce mécanisme)
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!