2016-08-24 2 views
2

Ich las oben auf Speicherlecks, weil der Speicher meiner Website hält häufen sich, wenn ich auf diesen Artikel von IBM kam:Führt die Ereignisbehandlung von jQuery zu Speicherlecks?

http://www.ibm.com/developerworks/web/library/wa-memleak/#N10116

Verschlüsse und zirkuläre Referenzen
In Listing 5 Sie sehen eine Schließung, in der ein JavaScript-Objekt (obj) einen Verweis auf ein DOM-Objekt enthält (referenziert von der ID "element"). Das DOM-Element hat wiederum einen Verweis auf das JavaScript-Objekt. Der resultierende Zirkelverweis zwischen dem JavaScript-Objekt und dem DOM-Objekt verursacht einen Speicherverlust.

Listing 5. Ereignisbehandlung Speicherverlust Muster:

<html> 
<body> 
<script type="text/javascript"> 
document.write("Program to illustrate memory leak via closure"); 
window.onload=function outerFunction(){ 
    var obj = document.getElementById("element"); 
    obj.onclick=function innerFunction(){ 
    alert("Hi! I will leak"); 
    }; 
    obj.bigString=new Array(1000).join(new Array(2000).join("XXXXX")); 
    // This is used to make the leak significant 
}; 
</script> 
<button id="element">Click Me</button> 
</body> 
</html> 

Eine Lösung, die sie verleihen, wird obj zu null am Ende des onload-function Einstellung.

(siehe Can someone explain this javascript memory leak scenario to me für eine Erklärung, warum dies schafft ein Speicherleck)


Jetzt kann ich mich sehr wohl hier etwas fehlt, daher die Frage, aber ist das nicht auch, was passiert, wenn Sie ein jQuery Event-Handler hinzu:

<html> 
<body> 
<script type="text/javascript"> 
$(window).load(function() { 
    $("element").on("click",function() { 
     alert("Will this also leak?"); 
    }); 
}; 
</script> 
<button id="element">Click Me</button> 
</body> 
</html> 

Sie haben grundsätzlich die gleiche click-handler innerhalb des , nicht wahr?
Ich weiß, dass Sie keine var obj erstellen, aber der Code erstellt immer noch ein jQuery-Objekt.

Füge ich wirklich ein Speicherleck mit jedem von mir hinzugefügten jQuery-Handler hinzu?
Oder bin ich völlig falsch in diesen beiden Situationen?

+0

Sie haben keine Antwort, empfehlen aber https://developers.google.com/web/tools/chrome-devtools/profile/memory-problems/memory-diagnosis?hl=de und https: // developer .chrome.com/devtools/docs/heap-profiling – juvian

+1

in ihrem Beispiel ist es ein Leck, aber es würde nur einmal auftreten. Ein Speicherverlust ist nur ein Problem, wenn es wiederholt auftritt. e.g Wenn Sie (sagen wir) einen webbasierten Chat haben und Ihre Methode, die Nachrichtenfenster zu aktualisieren, ein Leck verursacht, dann würden Sie schließlich nicht mehr genügend Speicher haben, wenn Nachrichten eintreffen. Aber wenn ein leakbares Ereignis nur EINMAL in auftritt die Lebensdauer der Seite, dann wird es kein großes Problem sein. –

+1

Dieser Artikel ist von 2007. Vergiss es. Browser, die Probleme mit zirkulären Referenzen hatten, die die DOM-Grenze überschreiten, sind für eine lange Zeit tot. – Bergi

Antwort

1

Ich war auf Speicher zu lesen auf Lecks, wenn ich auf diesen Artikel von IBM kam: http://www.ibm.com/developerworks/web/library/wa-memleak/#N10116

Dieser Artikel aus dem Jahr 2007 ist es vergessen. Browser, die Probleme mit zirkulären Referenzen hatten, die die DOM-Grenze überschreiten, sind für eine lange Zeit tot.

Ich weiß, dass Sie keine var obj erstellen, aber der Code erstellt immer noch ein jQuery-Objekt.

Und ohne die Variable schließt die Funktion nicht über das Objekt und erzeugt daher keinen Zirkelverweis. Wie auch immer, jQuery hat dieses Problem durch eine Umgehung für alte Browser behoben, in denen das DOM-Element nicht direkt auf den Handler referenziert.

+0

Danke, das beruhigt mich! Vor allem der zweite Teil ist hilfreich – myfunkyside

+0

In Bezug auf Ihren Kommentar über das Datum des Artikels .. Ich würde es nicht über Microsoft setzen, um einen Fehler wie folgt in IE zu behalten, nur weil sie dick sind, und tatsächlich damit durchkommen , Nein?:) – myfunkyside