web-dev-qa-db-fra.com

Comment détruire un objet JavaScript?

Récemment, je suis tombé sur une de mes applications qui utilise trop de mémoire et augmente de 10 Mo/s.

Ainsi, j'aime connaître le meilleur moyen de détruire un objet et des variables JavaScript pour que la consommation de mémoire reste au minimum et que mon FF ne puisse pas être détruit.

J'appelle deux de mon code JavaScript toutes les 8 secondes sans recharger la page.

function refresh() {
    $('#table_info').remove();
    $('#table').hide();
    if (refreshTimer) {
        clearTimeout(refreshTimer);
        refreshTimer = null ;
    }
    document.getElementById('refresh_topology').disabled=true; 
    $('<div id="preload_xml"></div>').html('<img src="pic/dataload.gif" alt="loading data" /><h3>Loading Data...</h3>').prependTo($("#td_123"));
    $("#topo").hide();
    $('#root').remove();
    show_topology();
}

Comment voir quelle cause variable surcharge de mémoire et quelle méthode arrêter l'exécution de ce processus?

71
Amit Shah

Vous pouvez placer tout votre code sous un seul espace de noms, comme ceci:

var namespace = {};

namespace.someClassObj = {};

delete namespace.someClassObj;

L'utilisation du mot clé delete supprimera la référence à la propriété, mais au niveau inférieur, le récupérateur de données JavaScript (GC) obtiendra plus d'informations sur les objets à récupérer.

Vous pouvez également utiliser Chrome Outils de développement pour obtenir un profil de mémoire de votre application et déterminer quels objets de votre application doivent être réduits.

81
Yochai Akoka

Vous ne pouvez pas supprimer des objets, ils sont supprimés lorsqu'il n'y a plus de référence à eux. Vous pouvez supprimer des références avec delete.

Cependant, si vous avez créé références circulaires dans vos objets, vous devrez peut-être découpler certaines choses.

30

Alors que les réponses existantes ont apporté des solutions pour résoudre le problème et la seconde moitié de la question, elles ne fournissent pas de réponse en gras à l'aspect découverte de la première moitié de la question: "Comment puis-je voir quelle cause variable? surcharge de mémoire ...? "

Il n’était peut-être pas aussi robuste il y a 3 ans, mais la section Chrome Devevloper Tools " Profiles " est maintenant assez puissant et riche en fonctionnalités. L’équipe Chrome a un article perspicace pour l’utiliser et ainsi aussi comment la récupération de place (GC) fonctionne en javascript, ce qui est au cœur de cette question.

Puisque delete est à la base de la réponse actuellement acceptée par Yochai Akoka, il est important de se rappeler ce que supprime la suppression. Cela n'a aucune importance s'il n'est pas combiné aux concepts de fonctionnement de GC dans les deux réponses suivantes: s'il existe une référence à un objet, elle n'est pas nettoyée. Les réponses sont plus correctes, mais probablement pas aussi appréciées, car elles nécessitent plus de réflexion que d'écrire simplement "supprimer". Oui, une solution possible pourrait être d'utiliser delete, mais cela n'aura pas d'importance s'il existe une autre référence à la fuite de mémoire.

delicatLatticeworkFever mentionne de manière appropriée les références circulaires et la documentation de l'équipe Chrome) peut fournir beaucoup plus de clarté, ainsi que des outils permettant de vérifier la cause.

Puisque delete a été mentionné ici, il peut également être utile de fournir la ressource nderstanding Delete . Bien que cela n'entre dans aucune des solutions réelles qui sont vraiment liées au GC de js.

26
Shwaydogg

Structurez votre code de sorte que tous vos objets temporaires se situent à l'intérieur de fermetures au lieu de propriétés d'espace de nom global/d'objet global et sortent de leur portée quand vous en avez fini. GC s'occupera du reste.

7
Oleg V. Volkov

Je faisais face à un problème comme celui-ci et ai eu l’idée de changer simplement le innerHTML des enfants de l’objet problématique.

adiv.innerHTML = "<div...> the original html that js uses </div>";

Ça a l'air sale, mais ça m'a sauvé la vie, comme ça marche!

1
Sergio Abreu