Maisoninterface Webjs tutorielComprendre le mécanisme de récupération de place, les fuites de mémoire et les fermetures de la série JS (3) avec un seul morceau de papier
Comprendre le mécanisme de récupération de place, les fuites de mémoire et les fermetures de la série JS (3) avec un seul morceau de papier
javascript vous présente le mécanisme de récupération de place, les fuites de mémoire et le contenu de fermeture. Jetons un coup d'œil au banc de fin rapide.
Écrit au début : Il s'agit d'une série que je suis sur le point de commencer à écrire dans la colonne javascript, principalement dans la framework A l'époque, même si j'utilise un framework pour le travail, pour les entretiens et l'avancement technique, les connaissances de base de JS sont la cerise sur le gâteau, et c'est aussi une connaissance que je dois apprendre même si ce n'est pas le cas. Il faut en savoir beaucoup sur les voitures pour conduire une voiture, il suffit de maîtriser les usages courants des voitures. Mais si vous connaissez les voitures, vous pouvez mieux conduire, et par la même occasion. Bien sûr, un article ne parlera pas uniquement d'un seul point de connaissance. Généralement, les points de connaissance associés seront connectés en série. Tout en enregistrant votre propre apprentissage, vous partagerez votre propre apprentissage et vous encouragerez mutuellement ! Si vous le pouvez, s'il vous plaît, donnez-moi un like Votre like me fera également travailler plus dur pour mettre à jour !
Aperçu
Temps de repas : 6-12 minutes
Difficulté : Facile, ne courez pas, surveillez avant de partir
Mécanisme de récupération de place
Le blog précédent explique principalement l'allocation et l'utilisation de la mémoire (mémoire de pile et mémoire de tas, copie profonde et copie superficielle, bien sûr, retour). la mémoire inutilisée revient à supprimer les logiciels inutilisés de votre téléphone en arrière-plan. Cela peut améliorer la vitesse de fonctionnement de votre téléphone. Sinon, s'il y a de plus en plus de mémoire, il restera bloqué tôt ou tard JS Il en va de même pour <.>.
De temps en temps, le JSéboueur de « patrouillera » les variables, tout comme les gardes de sécurité patrouillent dans le parc, laissant les personnes non pertinentes partir rapidement. Lorsqu'une variable n'est plus nécessaire, elle libère l'espace mémoire occupé par la variable. Ce processus est appelé Garbage Collection
JS L'algorithme de garbage collection est divisé en deux types, méthode de comptage de références et méthode d'effacement des marques
Méthode de comptage de références
La méthode de comptage de références est l'algorithme de collecte des ordures le plus rudimentaire et a été éliminée par les navigateurs modernes. Avant d'apprendre la méthode de comptage de références, vous devez d'abord avoir une certaine notion de la référence . Vous pouvez la considérer comme une description de l'adresse mémoire pointée par la variable actuelle, qui est quelque peu similaire à la. pointeur mémoire du type de données de référence JS. Pour comprendre le concept, regardons d'abord une ligne de code :
var obj={name:'jack'};复制代码
Copier après la connexion
Lorsque nous attribuons une valeur à obj, nous créons en fait une référence<🎜. > pointant vers la variable, avec un nombre de références de 1,Sous le mécanisme de comptage de références, chaque valeur en mémoire correspondra à un nombre de références
et lorsque nous attribuons
à obj, cette variable devient Un morceau de mémoire inutile, alors à ce moment, le décompte de références de null deviendra obj0, et il sera recyclé par le garbage collector, c'est-à-dire le l'espace mémoire occupé par sera libéréobj
Nous savons que le cycle de vie d'une fonction est très court. Une fois la fonction exécutée, les variables à l'intérieur sont fondamentalement inutiles. La conséquence de ne pas l'effacer est. que les déchets de mémoire ne sont pas libérés. , occupant toujours la mémoire d'origine et ne la lâchant pas, cela provoquera facilement une
fuite de mémoire Regardons d'abord un morceau de code et les résultats en cours d'exécution :
function changeName(){ var obj1={}; var obj2={};
obj1.target=obj2;
obj2.target=obj1;
obj1.age=15; console.log(obj1.target); console.log(obj2.target);
}
changeName();复制代码
Copier après la connexion
<. 🎜>Nous pouvons voir que et font référence l'un à l'autre, car lorsque obj1.target est modifié, obj2.target et obj1.age sont également affectés à en même temps, et le décompte de références vers lequel ils pointent est cohérent obj1.target.age Lorsque la fonction termine son exécution, obj2.target.age et
sont toujours bien vivants, car le décompte de références de obj1 et obj2 est toujours obj1.target1obj2.target après l'exécution. , il est clair que la fonction a été exécutée, mais ce genre de déchets existe toujours s'il y a trop de fonctions de ce type, Les fuites de mémoire seront inévitables.
Méthode d'effacement des marques
Les inconvénients de la méthode de comptage de références ci-dessus sont déjà évidents, donc la méthode de marquage et d'effacement dont nous parlons maintenant n'a pas un tel problème. Parce que la norme de jugement qu'il utilise est de voir si l'objet
est accessible
, il est principalement divisé en deux étapes, étape de marquage et étape de nettoyage :
Phase de marquage
Le garbage collector partira de l'objet racine (objet Window) et analysera tous les objets accessibles. C'est ce qu'on appelle
accessible
<. 🎜 >
Phase claire
Lors de l'analyse, les objets qui ne peuvent pas être atteints par l'objet racine (
inaccessible
) sont des objets considérés comme inutiles et seront éliminés comme déchets
现在再来看下上面的代码
function changeName(){ var obj1={}; var obj2={};
obj1.target=obj2;
obj2.target=obj1;
obj1.age=15; console.log(obj1.target); console.log(obj2.target);
}
changeName();复制代码
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 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
Les expressions C++ Lambda prennent en charge les fermetures, qui enregistrent les variables de portée de fonction et les rendent accessibles aux fonctions. La syntaxe est [capture-list](parameters)->return-type{function-body}. capture-list définit les variables à capturer. Vous pouvez utiliser [=] pour capturer toutes les variables locales par valeur, [&] pour capturer toutes les variables locales par référence, ou [variable1, variable2,...] pour capturer des variables spécifiques. Les expressions Lambda ne peuvent accéder qu'aux variables capturées mais ne peuvent pas modifier la valeur d'origine.
Une fermeture est une fonction imbriquée qui peut accéder aux variables dans la portée de la fonction externe. Ses avantages incluent l'encapsulation des données, la conservation de l'état et la flexibilité. Les inconvénients incluent la consommation de mémoire, l’impact sur les performances et la complexité du débogage. De plus, les fermetures peuvent créer des fonctions anonymes et les transmettre à d'autres fonctions sous forme de rappels ou d'arguments.
Les fuites de mémoire peuvent entraîner une augmentation continue de la mémoire du programme Go en : fermant les ressources qui ne sont plus utilisées, telles que les fichiers, les connexions réseau et les connexions à la base de données. Utilisez des références faibles pour éviter les fuites de mémoire et ciblez les objets pour le garbage collection lorsqu'ils ne sont plus fortement référencés. En utilisant go coroutine, la mémoire de la pile de coroutines sera automatiquement libérée à la sortie pour éviter les fuites de mémoire.
Valgrind détecte les fuites de mémoire et les erreurs en simulant l'allocation et la désallocation de mémoire. Pour l'utiliser, suivez ces étapes : Installez Valgrind : Téléchargez et installez la version correspondant à votre système d'exploitation à partir du site officiel. Compilez le programme : Compilez le programme à l'aide des indicateurs Valgrind (tels que gcc-g-omyprogrammyprogram.c-lstdc++). Analyser le programme : utilisez la commande valgrind--leak-check=fullmyprogram pour analyser le programme compilé. Vérifiez le résultat : Valgrind générera un rapport après l'exécution du programme, affichant les fuites de mémoire et les messages d'erreur.
Une fuite de mémoire en C++ signifie que le programme alloue de la mémoire mais oublie de la libérer, ce qui empêche la réutilisation de la mémoire. Les techniques de débogage incluent l'utilisation de débogueurs (tels que Valgrind, GDB), l'insertion d'assertions et l'utilisation de bibliothèques de détecteurs de fuite de mémoire (telles que Boost.LeakDetector, MemorySanitizer). Il démontre l'utilisation de Valgrind pour détecter les fuites de mémoire à travers des cas pratiques et propose les meilleures pratiques pour éviter les fuites de mémoire, notamment : toujours libérer la mémoire allouée, utiliser des pointeurs intelligents, utiliser des bibliothèques de gestion de la mémoire et effectuer des vérifications régulières de la mémoire.
Les fermetures en Java permettent aux fonctions internes d'accéder aux variables de portée externe même si la fonction externe est terminée. Implémentée via des classes internes anonymes, la classe interne contient une référence à la classe externe et maintient les variables externes actives. Les fermetures augmentent la flexibilité du code, mais vous devez être conscient du risque de fuite de mémoire, car les références à des variables externes par des classes internes anonymes maintiennent ces variables en vie.
Les fermetures de fonctions du langage Go jouent un rôle essentiel dans les tests unitaires : Capture de valeurs : les fermetures peuvent accéder aux variables dans la portée externe, permettant ainsi de capturer et de réutiliser les paramètres de test dans des fonctions imbriquées. Simplifiez le code de test : en capturant les valeurs, les fermetures simplifient le code de test en éliminant le besoin de définir des paramètres à plusieurs reprises pour chaque boucle. Améliorez la lisibilité : utilisez des fermetures pour organiser la logique de test, rendant ainsi le code de test plus clair et plus facile à lire.
Les fonctions anonymes sont concises et anonymes, mais ont une mauvaise lisibilité et des difficultés de débogage ; les fermetures peuvent encapsuler les données et gérer l'état, mais peuvent entraîner une consommation de mémoire et des références circulaires. Cas pratique : Les fonctions anonymes peuvent être utilisées pour des traitements numériques simples, et les fermetures peuvent mettre en œuvre une gestion d'état.