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?
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
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. –
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