2008-08-21 7 views
3

ich einen großen Web-App, die 6.eHuge Web App mit dem Memory Leak in IE 6

Beheben ein Speicherlecks in einer 5-Leitungscode Probe in IE Probleme mit Speicherleck aufweist, der das Problem demonstriert ist einfach.

Aber wenn ich eine sehr große Anwendung habe, wo sollte ich anfangen?

Antwort

7

prüfen Drip aus. Das nimmt normalerweise das Rätselraten aus IE-Speicherlecks.

Wenn aus irgendeinem Grund Drip es nicht finden, nehmen Sie einen genauen Blick auf jeden JavaScript-Code, der mit Ereignissen funktioniert. Dies ist fast immer die Ursache für ein bedeutendes Speicherleck in einem Browser.

Löschen eines DOM-Element mit Handler daran befestigt, ohne zuerst diese Handler zu entfernen, wird der Speicher verhindern mit diesen Handler zugeordnet ist, von zurückgewonnen wird.

1

Verwendet die Anwendung viel JavaScript?

Wenn dies der Fall ist, dann habe ich herausgefunden, dass es hilft, Speicherlecks zu vermeiden. Stellen Sie sicher, dass Sie ein JavaScript-Framework wie Prototype oder jQuery verwenden, da sie Code zur Ereignisverarbeitung getestet und getestet haben. t Leckspeicher.

-3

Sie sind Speicherfunktionen von Java undicht?

Hier ist eine Lösung: Nehmen Sie Ihre Homebrew Java und Chuck es. Verwenden Sie eines der Standard-JavaScript-Frameworks wie jQuery.

Wenn Sie komplexe Javascript tun und sind nicht ein Java-Guru, tun Sie es nicht selbst.

Edit: Was, ist das ein schlechter Rat? Javascript ist nicht nur eine einfache Skriptsprache; Es ist eine komplexe und überraschend leistungsfähige Programmiersprache, die eng mit dem HTML-DOM verbunden ist, das in verschiedenen Browsern unterschiedlich implementiert ist. Wenn Sie es falsch machen, verlieren Sie nicht nur den Speicher, sondern werfen auch Fehler überall hin und machen das Surfen im Allgemeinen fürchterlich. Möchten Sie die Leute, die auf Ihre Website kommen, vertreiben? Nein? Dann verwenden Sie ein Javascript-Framework und loswerden all Ihrer hacky Cross-Browser Bullshittery.

+0

Ich habe Sie nicht mod modifiziert, aber jQuery selbst hat in einigen Fällen Speicherlecks, zusammen mit der jQuery UI. Zumindest mit der Version 1.3.2 ... – rball

0

Hier ist, wie ich das Memory-Leak-Problem in IE7 gelöst habe. Die Idee besteht darin, alle expando-Eigenschaften auf allen DOM-Knoten beim Entladen der Seite auf null zu setzen. Das hat für mich funktioniert. Sie können es nützlich finden.

<!--[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]--> 

Sie können alle "Debugger" entfernen möchten. wenn Sie keine gelegentlichen Ausnahmen haben möchten.