Maison  >  Article  >  interface Web  >  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

清浅
清浅original
2019-03-16 11:49:433987parcourir

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"}
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。
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);
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 就可以被垃圾回收了
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  }
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!

Déclaration:
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