Question

J'ai une énorme application Web qui rencontre des problèmes de fuite de mémoire dans IE 6.

Corriger une fuite de mémoire dans un exemple de code de 5 lignes qui démontre le problème est simple.

Mais si j’ai une application très volumineuse, par où dois-je commencer ?

Était-ce utile?

La solution

Vérifier Goutte.Cela élimine généralement les incertitudes liées aux fuites de mémoire d'IE.

Si, pour une raison quelconque, Drip ne le trouve pas, examinez attentivement tout code JavaScript qui fonctionne avec les événements.C'est presque toujours la source de toute fuite de mémoire importante dans un navigateur.

Détruire un élément DOM auquel sont attachés des gestionnaires, sans supprimer ces gestionnaires au préalable, empêchera la récupération de la mémoire associée à ces gestionnaires.

Autres conseils

L'application utilise-t-elle beaucoup de JavaScript ?

Si tel est le cas, une chose que j'ai trouvée qui aide à éviter les fuites de mémoire est de vous assurer que vous utilisez un framework JavaScript tel que Prototype ou jQuery, car ils ont essayé et testé un code de gestion d'événements qui ne perd pas de mémoire.

Voici comment j'ai résolu le problème de fuite de mémoire dans IE7.L'idée est de supprimer/définir sur null toutes les propriétés expando sur tous les nœuds DOM lors du déchargement de la page.Cela a fonctionné pour moi.Vous pourriez le trouver utile.

<!--[if lt IE 8]>
<script type="text/javascript">

function disposeAll() {
    if (window.document.all) {
        for (var index = 0; index < window.document.all.length; index++) {
            try { dispose(window.document.all[index], []); } catch (e) { debugger; }
        }
    }
    dispose(window.document.body, []);
    dispose(window.document, []);
    dispose(window, []);
    window.disposeAll = null;
    window.dispose = null;
    window.onunload = null;
}

function dispose(something, map) {
    if (something == null) return;
    if (something.dispose && typeof (something.dispose) == 'function') {
        try { something.dispose(); } catch (e) { debugger; }
    }
    map.push(something);
    for (var key in something) {
        var value = null;
        try { value = something[key]; } catch (e) { };
        if (value == null || value == dispose || value == disposeAll) continue;

        var processed = null;
        for (var index = 0; index < map.length; index++) {
            if (map[index] === value) {
                processed = value;
                break;
            }
        }
        if (processed != null) continue;
        var constructor = value.constructor;
        if (constructor == Object || constructor == Array) {
            try { dispose(value, map); } catch (e) { debugger; }
        }
        if (constructor == Object || constructor == Array || constructor == Function) {
            try { something[key] = null; } catch (e) { debugger; }
        }
    }
    map.pop();
}

(function() {
    var previousUnloadHandler = window.onunload;
    if (previousUnloadHandler == null) {
        window.onunload = disposeAll;
    } else {
        window.onunload = function() {
            previousUnloadHandler.apply(this, arguments); // <== HERE YOU MAY WANT TO HAVE AN "IF" TO MAKE SURE THE ORIGINAL UNLOAD EVENT WASN'T CANCELLED
            disposeAll();
            previousUnloadHandler = null;
        };
    }
}());

</script>
<![endif]-->

Vous voudrez peut-être supprimer tous les «débogueurs»; déclarations si vous n'avez pas envie de faire face à des exceptions occasionnelles.

Vous perdez de la mémoire à partir des fonctions Java ?

Voici une solution :Prenez votre homebrew java et jetez-le.Utilisez l'un des frameworks javascript standards, tels que jQuery.

Si vous utilisez du javascript complexe et que vous n'êtes pas un gourou de Java, ne le faites pas vous-même.

Modifier:Quoi, c'est un mauvais conseil ?Javascript n'est pas qu'un simple langage de script ;c'est un langage de programmation complexe et étonnamment puissant, étroitement lié au HTML DOM, qui est implémenté différemment selon les navigateurs.Si vous le faites mal, non seulement vous perdrez de la mémoire, mais vous générerez également des erreurs partout et rendrez généralement l'expérience de navigation horrible.Voulez-vous faire fuir les personnes qui viennent sur votre site Web ?Non?Ensuite, utilisez un framework javascript et débarrassez-vous de toutes vos conneries piratées entre navigateurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top