Maison > interface Web > js tutoriel > Qu'est-ce qu'une fuite de mémoire et comment y remédier

Qu'est-ce qu'une fuite de mémoire et comment y remédier

清浅
Libérer: 2020-07-10 17:52:28
original
4037 Les gens l'ont consulté

Une fuite de mémoire signifie que lorsqu'un objet est inefficace et doit être recyclé, mais qu'il ne peut pas être recyclé en raison de la référence d'un autre objet à celui-ci, et qu'il reste dans la mémoire tas, cela s'appelle une fuite de mémoire. Les plus courants incluent des variables globales inattendues, des fuites DOM et des références circulaires, etc.

Qu'est-ce qu'une fuite de mémoire et comment y remédier

[Cours recommandés : Tutoriel JavaScript]

Fuite de mémoire

La fuite de mémoire fait généralement référence au moment où un objet n'a aucune utilité et doit être recyclé. Un autre objet en cours d'utilisation ne peut pas être recyclé du fait de sa référence. Cet objet qui ne peut pas être recyclé reste dans la mémoire du tas, ce qui provoque une fuite de mémoire

Quand un objet n'est plus nécessaire Quand l'objet qui est censé l'être est atteint. recyclé est utilisé, un autre objet en cours d'utilisation contient une référence à celui-ci, ce qui empêche son recyclage de l'objet qui doit être recyclé et reste dans la mémoire du tas, ce qui provoque une fuite de mémoire

Fuites de mémoire courantes :

1. Variables globales inattendues

La façon dont Js gère les variables non définies : non définie La variable créera une nouvelle variable dans l'objet global Dans le navigateur, l'objet global est window.

function foo(arg) { 
bar = "this is a hidden global variable"; //等同于window.bar="this is a hidden global variable"
this.bar2= "potential accidental global";//这里的this 指向了全局对象(window),
等同于window.bar2="potential accidental global"}
Copier après la connexion
Solution : Ajoutez et activez le mode strict 'use strict' dans le programme JavaScript pour éviter efficacement les problèmes ci-dessus.

Remarque : les variables globales utilisées pour stocker temporairement de grandes quantités de données doivent être définies sur null ou réaffectées après s'être assurées que les données sont traitées.

2. Fuite du DOM

Dans le navigateur, les moteurs utilisés par DOM et JS sont différents, tandis que JS utilise un moteur v8, donc en utilisant. JS pour faire fonctionner DOM consommera plus de performances, donc afin de réduire les opérations DOM, nous utiliserons des références de variables pour les mettre en cache dans l'environnement actuel. Si vous effectuez certaines opérations de suppression ou de mise à jour, vous risquez d'oublier de libérer le DOM mis en cache, provoquant ainsi une fuite de mémoire

Exemple : Référence à

élément du DOM qui n'a pas été nettoyé

var refA = document.getElementById('refA');
document.body.removeChild(refA); // #refA不能回收,因为存在变量refA对它的引用。
将其对#refA引用释放,但还是无法回收#refA。
Copier après la connexion
Solution : Définir refA = null;

3. Minuteries et fonctions de rappel oubliées

var someResource = getData();
setInterval(function() {
    var node = document.getElementById('Node');
    if(node) {
        node.innerHTML = JSON.stringify(someResource));
    }
}, 1000);
Copier après la connexion
Un code comme celui-ci est très courant, si l'identifiant Si l'élément Node est supprimé du DOM, le timer existera toujours. En même temps, comme la fonction de rappel contient une référence à someResource, someResource en dehors du timer ne sera pas libérée

4. Référence circulaire

Dans l'environnement de gestion de mémoire de js, si l'objet A a l'autorisation d'accéder à l'objet B, il est appelé objet A faisant référence à l'objet B. La stratégie de comptage de références consiste à voir si l'objet a d'autres objets qui le référencent. Si aucun objet ne fait référence à l'objet, alors l'objet sera recyclé.

var obj1 = { a: 1 }; // 一个对象(称之为 A)被创建,赋值给 obj1,A 的引用个数为 1  
var obj2 = obj1; // A 的引用个数变为 2  
 obj1 = 0; // A 的引用个数变为 1 
 obj2 = 0; // A 的引用个数变为 0,此时对象 A 就可以被垃圾回收了
Copier après la connexion
Mais le plus gros problème avec le comptage de références concerne les références circulaires.

function func() {  
    var obj1 = {};  
    var obj2 = {};  
    obj1.a = obj2; // obj1 引用 obj2  
    obj2.a = obj1; // obj2 引用 obj1  }
Copier après la connexion
Lorsque la fonction est exécutée, la valeur de retour n'est pas définie, donc l'intégralité de la fonction et les variables internes doivent être recyclées. Cependant, selon la méthode de comptage de références, le nombre de références de obj1 et obj2 est. pas 0, donc ils ne seront pas recyclés. Donc, pour résoudre ce problème, vous pouvez définir leurs valeurs sur null

Résumé : ce qui précède est l'intégralité du contenu de cet article, j'espère qu'il sera utile à tout le monde.

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