Web énorme App avec fuite de mémoire dans IE 6


3

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

Fixation d'une fuite de mémoire dans un exemple de code 5 ligne qui illustre le problème est facile.

Mais si j'ai une très grande application, par où commencer?

7

Découvrez Drip. Cela prend généralement l'incertitude sur les fuites de mémoire IE.

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

La destruction d'un élément DOM avec des gestionnaires attachés à celui-ci, sans d'abord supprimer ces gestionnaires, empêchera la récupération de la mémoire associée à ces gestionnaires.


1

L'application utilise-t-elle beaucoup de JavaScript? Si c'est le cas, alors une chose que j'ai trouvé qui aide à éviter les fuites de mémoire est de s'assurer que vous utilisez un framework JavaScript tel que Prototype ou jQuery parce qu'ils ont essayé et testé le code de gestion d'événements t mémoire de fuite.


-3

Vous fuite de mémoire des fonctions Java?

Voici une solution: Prenez votre homebrew java et chuck it. Utilisez l'un des frameworks javascript standard, tels que jQuery.

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

Edit: Quoi, c'est un mauvais conseil? Javascript n'est pas seulement un langage de script simple; C'est un langage de programmation complexe et étonnamment puissant qui est étroitement lié au DOM HTML, qui est implémenté différemment dans différents navigateurs. Si vous le faites mal, vous ferez non seulement de la mémoire mais aussi des erreurs partout et rendront l'expérience de navigation horrible. Voulez-vous chasser les visiteurs de votre site Web? Non? Ensuite, utilisez un framework javascript et se débarrasser de tous vos hacky cross-navigateur bullshittery.

  0

Je ne vous ai pas modulé mais jQuery a lui-même des fuites de mémoire dans certains cas, ainsi que l'interface utilisateur jQuery. Au moins avec la version 1.3.2 ... 12 mai. 092009-05-12 22:40:59


0

Voici comment j'ai résolu le problème de fuite de mémoire dans IE7. L'idée est de disposer/mettre à zéro 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 pouvez supprimer tout "débogueur;" déclarations si vous n'avez pas envie de faire face à quelques exceptions occasionnelles.