Maison interface Web js tutoriel Une discussion détaillée des compétences JavaScript en matière de fuites de mémoire_javascript

Une discussion détaillée des compétences JavaScript en matière de fuites de mémoire_javascript

May 16, 2016 pm 04:31 PM
javascript 内存泄漏

1. Qu'est-ce qu'une fermeture et la chaîne de portée impliquée dans la fermeture ne sera pas discutée ici.

2. Mécanisme de récupération de place JavaScript

JavaScript n'a pas besoin de libérer manuellement de la mémoire, il utilise un mécanisme automatique de récupération de place (garbage collection). Lorsqu'un objet est inutile, c'est-à-dire lorsqu'aucune variable du programme ne fait référence à l'objet, la variable sera libérée de la mémoire.

Copier le code Le code est le suivant :

vars = [1, 2,3];
var s = nul;
// De cette façon, le tableau d'origine [1,2,3] sera libéré.

3. Référence circulaire

Trois objets A, B, C

AàBàC : Un certain attribut de A fait référence à B, et C est également référencé par un attribut de B. Si A est effacé, alors B et C sont également libérés.

AàBàCàB : Ici, un certain attribut de C est ajouté pour référencer l'objet B. Si cela doit effacer A, alors B et C ne seront pas libérés car une référence circulaire est générée entre B et C.

Copier le code Le code est le suivant :

var une = {};
a.pro = { a:100 };
a.pro.pro = {b:100};
une = nul
//Dans ce cas, {a:100} et {b:100} sont également publiés en même temps.
                                                                    var obj = {};
Obj.pro = { a : 100 };
Obj.pro.pro = { b : 200 };
var deux = obj.pro.pro;
Obj = nul
//Dans ce cas, {b:200} ne sera pas publié, mais {a:100} sera publié.

4. Références circulaires et fermetures

Copier le code Le code est le suivant :
fonction externe(){
var obj = {};
fonction interne(){
//L'objet obj est référencé ici
>
         obj.inner = inner;
>

Il s'agit d'une référence circulaire extrêmement cachée. Lorsque external est appelé une fois, deux objets, obj et inner, seront créés à l'intérieur. La propriété inner de obj fait référence à inner ; de la même manière, inner fait également référence à obj. C'est parce que obj est toujours dans l'environnement fermé de innerFun. soyez précis, cela est dû à la "chaîne de portée" unique de JavaScript.

Par conséquent, les fermetures sont très faciles à créer des références circulaires. Heureusement, JavaScript peut très bien gérer de telles références circulaires.

5. Fuite de mémoire dans IE

Il existe plusieurs types de fuites de mémoire dans IE, et vous trouverez des explications détaillées ici (

http://msdn.microsoft.com/en-us/library/bb250448.aspx).

Un seul d’entre eux est abordé ici, à savoir la fuite de mémoire provoquée par référence circulaire, car c’est la situation la plus courante.

Lorsqu'il existe une référence circulaire entre un élément DOM ou un objet ActiveX et un objet JavaScript normal, IE a des difficultés particulières à libérer de telles variables. Il est préférable de couper manuellement la référence circulaire. Ce bug a été corrigé dans IE. 7 (

http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html).

« IE 6 souffrait de fuites de mémoire lorsqu'une référence circulaire entre plusieurs objets, parmi lesquels au moins un nœud DOM, était créée. Ce problème a été résolu dans IE 7. »

.

Si dans l'exemple ci-dessus (point 4) obj ne fait pas référence à un objet Fonction JavaScript (interne), mais à un objet ActiveX ou à un élément Dom, la référence circulaire formée dans IE ne peut pas être libérée.

Copier le code Le code est le suivant :

Fonction init(){
        var elem = document.getElementByid( 'id' );
          elem.onclick = function(){
alert('homme-pluie');
//L'élément elem
est référencé ici         };
>

Elem fait référence à sa fonction d'écoute d'événements de clic, qui fait également référence à l'élément elem via sa chaîne de portée. De cette façon, ces références circulaires ne seront pas publiées même si vous quittez la page actuelle dans IE.

6.Solution

La méthode de base consiste à effacer manuellement cette référence circulaire. Voici un exemple très simple. Dans une application réelle, vous pouvez créer vous-même une fonction addEvent() et effacer toutes les liaisons d'événements sur l'événement de déchargement de la fenêtre.

Copier le code Le code est le suivant :

fonction externe(){
         var one = document.getElementById( 'one' );
         one.onclick = function(){};
>
​ window.onunload = function(){
         var one = document.getElementById( 'one' );
         one.onclick = null;
};

Autres méthodes (par : Douglas Crockford)

Copier le code Le code est le suivant :

/**
* Traverser un nœud d'élément et tous ses éléments descendants
*
* @param Elem node Le nœud d'élément à effacer
* @param function func La fonction de traitement
*
​*/
function walkTheDOM (noeud, func) {
func(nœud);
node = node.firstChild;
while (nœud) {
         walkTheDOM(node, func); Node = node.nextSibling;
}
}
/**
* Effacez toutes les références aux nœuds dom pour éviter les fuites de mémoire
*
* @param Elem node Le nœud d'élément à effacer
*
​*/
fonction purgeEventHandlers (nœud) {
walkTheDOM(nœud, fonction (e) {
pour (var n dans e) {                                    Si (type de e[n] ===
                      'fonction') {
                  e[n] = null;
            }
>
});


Ce qui précède présente le contenu pertinent et les solutions aux fuites de mémoire JavaScript. Les amis dans le besoin peuvent s'y référer.
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Go suivi des fuites mémoire : guide pratique Go pprof Go suivi des fuites mémoire : guide pratique Go pprof Apr 08, 2024 am 10:57 AM

L'outil pprof peut être utilisé pour analyser l'utilisation de la mémoire des applications Go et détecter les fuites de mémoire. Il fournit des capacités de génération de profils de mémoire, d’identification des fuites de mémoire et d’analyse en temps réel. Générez un instantané de mémoire à l'aide de pprof.Parse et identifiez les structures de données avec le plus d'allocations de mémoire à l'aide de la commande pprof-allocspace. Dans le même temps, pprof prend en charge l'analyse en temps réel et fournit des points de terminaison permettant d'accéder à distance aux informations sur l'utilisation de la mémoire.

Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Jan 05, 2024 pm 06:08 PM

Tutoriel JavaScript : Comment obtenir le code d'état HTTP, des exemples de code spécifiques sont requis Préface : Dans le développement Web, l'interaction des données avec le serveur est souvent impliquée. Lors de la communication avec le serveur, nous devons souvent obtenir le code d'état HTTP renvoyé pour déterminer si l'opération a réussi et effectuer le traitement correspondant en fonction de différents codes d'état. Cet article vous apprendra comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournira quelques exemples de codes pratiques. Utilisation de XMLHttpRequest

Résoudre le problème de fuite de mémoire causé par les fermetures Résoudre le problème de fuite de mémoire causé par les fermetures Feb 18, 2024 pm 03:20 PM

Titre : Fuites de mémoire causées par les fermetures et solutions Introduction : Les fermetures sont un concept très courant en JavaScript, qui permettent aux fonctions internes d'accéder aux variables des fonctions externes. Cependant, les fermetures peuvent provoquer des fuites de mémoire si elles ne sont pas utilisées correctement. Cet article explorera le problème de fuite de mémoire provoqué par les fermetures et fournira des solutions et des exemples de code spécifiques. 1. Fuites de mémoire causées par les fermetures La caractéristique des fermetures est que les fonctions internes peuvent accéder aux variables des fonctions externes, ce qui signifie que les variables référencées dans les fermetures ne seront pas récupérées. S'il est mal utilisé,

Comment détecter les fuites de mémoire en utilisant Valgrind ? Comment détecter les fuites de mémoire en utilisant Valgrind ? Jun 05, 2024 am 11:53 AM

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.

Comment éviter les fuites de mémoire dans l'optimisation des performances techniques de Golang ? Comment éviter les fuites de mémoire dans l'optimisation des performances techniques de Golang ? Jun 04, 2024 pm 12:27 PM

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.

Techniques de débogage pour les fuites de mémoire en C++ Techniques de débogage pour les fuites de mémoire en C++ Jun 05, 2024 pm 10:19 PM

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.

Comment éviter efficacement les fuites de mémoire dans les fermetures ? Comment éviter efficacement les fuites de mémoire dans les fermetures ? Jan 13, 2024 pm 12:46 PM

Comment éviter les fuites de mémoire lors des fermetures ? La fermeture est l'une des fonctionnalités les plus puissantes de JavaScript, qui permet l'imbrication de fonctions et l'encapsulation des données. Cependant, les fermetures sont également sujettes à des fuites de mémoire, en particulier lorsqu'il s'agit d'asynchrones et de minuteries. Cet article explique comment éviter les fuites de mémoire lors des fermetures et fournit des exemples de code spécifiques. Les fuites de mémoire se produisent généralement lorsqu'un objet n'est plus nécessaire, mais que la mémoire qu'il occupe ne peut pas être libérée pour une raison quelconque. Dans une fermeture, lorsqu'une fonction fait référence à des variables externes, et ces variables

Comment obtenir facilement le code d'état HTTP en JavaScript Comment obtenir facilement le code d'état HTTP en JavaScript Jan 05, 2024 pm 01:37 PM

Introduction à la méthode d'obtention du code d'état HTTP en JavaScript : Dans le développement front-end, nous devons souvent gérer l'interaction avec l'interface back-end, et le code d'état HTTP en est une partie très importante. Comprendre et obtenir les codes d'état HTTP nous aide à mieux gérer les données renvoyées par l'interface. Cet article explique comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournit des exemples de code spécifiques. 1. Qu'est-ce que le code d'état HTTP ? Le code d'état HTTP signifie que lorsque le navigateur lance une requête au serveur, le service

See all articles