Maison  >  Article  >  développement back-end  >  Qu’est-ce que le garbage collection en PHP ? Quel impact cela a-t-il sur les performances ?

Qu’est-ce que le garbage collection en PHP ? Quel impact cela a-t-il sur les performances ?

青灯夜游
青灯夜游avant
2021-07-29 18:28:072257parcourir

Cet article vous présentera le garbage collection, analysera brièvement le mécanisme de garbage collection en PHP et enfin parlera de l'impact du garbage collection sur les performances.

Qu’est-ce que le garbage collection en PHP ? Quel impact cela a-t-il sur les performances ?

Je crois que les étudiants qui ont appris un peu le développement savent que quel que soit le langage de programmation, une variable sera stockée en mémoire. En fait, nous, les développeurs, manipulons constamment la mémoire. En conséquence, si nous continuons à ajouter de nouvelles variables, la mémoire continuera d'augmenter. S'il n'y a pas de bon mécanisme, la mémoire augmentera sans limite et finira par être pleine. Cela provoque une fuite de mémoire. Mais dans le développement quotidien, à moins qu'un gros fichier ne soit chargé à la fois, nous ne voyons presque jamais d'erreurs de dépassement de mémoire. C'est le rôle du mécanisme de récupération de place.

Qu'est-ce que la collecte des déchets ?

Lorsque nous utilisons le langage C, nous devons utiliser manuellement free pour libérer de la mémoire. La plupart des langages de programmation après C seront dotés d'une capacité de traitement telle que le garbage collection, qui est le mécanisme de garbage collection dont nous allons parler aujourd'hui. , également connu sous le nom de GC. Dans les langages de développement dotés de capacités GC, nous n'avons pas besoin de nous soucier du moment où libérer de la mémoire, et nous n'avons même pas besoin de comprendre le contenu de cet article, car ces langages ont déjà géré le problème de libération de mémoire pour nous au niveau inférieur.

Bien sûr, le contenu le plus connu dans ce domaine est le mécanisme de récupération de place en Java. En fait, PHP dispose également d'un mécanisme de traitement correspondant. Bien sûr, de nombreux PHP n'y ont peut-être jamais été exposés. .

L'algorithme de récupération de place de PHP

Dans l'article précédent, nous avons introduit le concept de comptage de références. Avant PHP5.3, le mécanisme de récupération de place de PHP était très simple : il consistait à nettoyer et à recycler tous les éléments avec un refcount de 0, ce qui était gratuit au niveau inférieur. Mais cette méthode posera un problème, qui est la référence circulaire dont nous avons parlé dans l'article sur le comptage de références. Ce type de problème de référence ne peut pas être recyclé par le jugement ordinaire du refcount. Ainsi, avant PHP5.3, les références circulaires provoquaient des fuites de mémoire.

La raison pour laquelle j'insiste sur la version est qu'après la version 5.3, PHP a amélioré l'algorithme de récupération de place et résolu cette référence circulaire. (Bien sûr, nous essayons d’éviter ce genre de problème de référence circulaire dans le développement quotidien). Pour l'algorithme spécifique, nous citons la photo officielle :

Qu’est-ce que le garbage collection en PHP ? Quel impact cela a-t-il sur les performances ?

Il y a une explication détaillée dans le document officiel, mais cela vous laisse toujours confus. Utilisons un langage simple (langage humain) pour décrire ce processus.

Tout d'abord, nous avons le concept de tampon racine, qui est la racine dans l'image. Au niveau le plus bas, grâce à une série d’algorithmes incompréhensibles, nous pouvons trouver une racine possible de chaque variable. PHP mettra les racines possibles de la variable dans le tampon racine.

Lorsque le tampon racine est plein, la valeur par défaut est généralement 10000. Vous devez modifier le code source et recompiler pour modifier cette valeur. PHP démarrera le mécanisme de récupération de place, recherchera toutes les variables liées à cette racine possible à partir du tampon racine selon l'algorithme de traversée en profondeur, réduira de 1 le refcount de la variable trouvée par une certaine racine possible et fera une marque à marquer l'actuel.

Ensuite, traversez à nouveau la profondeur. Si refcount n'est pas 0, ajoutez 1. S'il est 0, laissez-le inchangé.

Ensuite, effacez toutes les racines possibles dans le tampon racine, en effaçant plutôt qu'en supprimant. Ensuite, nettoyez et libérez tout le contenu des variables avec un refcount de 0.

Êtes-vous déjà confus ? En fait, je suis tellement confus que je ne sais même pas comment ce paragraphe a été écrit....

N'oubliez pas quelques points clés et vous pourrez gérer l'interview et tuer la plupart des gens instantanément.

  • Après PHP5.3, nous ne vérifions pas directement si le refcount de chaque variable est 0. L'algorithme utilisé est un parcours en profondeur. Il existe un tampon racine et il est nettoyé en fonction de celui-ci. L'algorithme spécifique nécessite une base solide de. C et les algorithmes. , étudiez-le attentivement lorsque vous apprenez le code source
  • 5.3 et l'algorithme a ensuite résolu le problème des références circulaires
  • La valeur de la fuite de mémoire restera dans une certaine plage, et il n'y aura pas de problème immédiat à grande échelle. crash
Le garbage collection a un impact sur les performances L'impact de

Comme mentionné précédemment, le garbage collection sera exécuté immédiatement après que le tampon racine soit plein. Il y aura également deux traversées en profondeur, ce qui entraînera inévitablement une consommation de performances. Après tout, l’exécution d’algorithmes prend du temps. Cependant, comparée aux erreurs dévastatrices telles que le débordement de mémoire, la perte de performances causée par le garbage collection est fondamentalement négligeable.

Résumé

En fait, nous devons seulement rappeler quelques points clés concernant le garbage collection. L'algorithme de base spécifique et le contenu ne peuvent être pleinement compris qu'après une étude plus approfondie du code source. c'est aussi ce que nous Le but de l'apprentissage est que nous couvrirons certainement le contenu sous-jacent du code source à l'avenir, alors attendons de voir !

Apprentissage recommandé : "

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