बस यहाँ जानकारी को अद्यतन करने के लिए। मैं विभिन्न ब्राउज़रों का परीक्षण कर रहा हूं, विशेष रूप से iframe onload घटनाओं पर परिपत्र निर्भर इवेंट श्रोताओं के लिए मेमोरी लीक के लिए।
उपयोग किया गया कोड (jsfiddle मेमोरी परीक्षण में हस्तक्षेप करता है, इसलिए इस परीक्षण के लिए अपने स्वयं के सर्वर का उपयोग करें):
<div>
<label>
<input id="eventListenerCheckbox" type="checkbox" /> Clear event listener when removing iframe
</label>
<div>
<button id="startTestButton">Start Test</button>
</div>
</div>
<div>
<pre id="console"></pre>
</div>
<script>
(function() {
var consoleElement = document.getElementById('console');
window.log = function(text) {
consoleElement.innerHTML = consoleElement.innerHTML + '<br>' + text;
};
}());
(function() {
function attachEvent(element, eventName, callback) {
if (element.attachEvent)
{
element.attachEvent(eventName, callback);
}
else
{
element[eventName] = callback;
}
}
function detachEvent(element, eventName, callback) {
if (element.detachEvent)
{
element.detachEvent(eventName, callback);
}
else
{
element[eventName] = null;
}
}
var eventListenerCheckbox = document.getElementById('eventListenerCheckbox');
var startTestButton = document.getElementById('startTestButton');
var iframe;
var generatedOnLoadEvent;
function createOnLoadFunction(iframe) {
var obj = {
increment: 0,
hugeMemory: new Array(100000).join('0') + (new Date().getTime()),
circularReference: iframe
};
return function() {
obj.increment += 1;
destroy();
};
}
function create() {
iframe = document.createElement('iframe');
generatedOnLoadEvent = createOnLoadFunction(iframe);
attachEvent(iframe, 'onload', generatedOnLoadEvent);
document.body.appendChild(iframe);
}
function destroy() {
if (eventListenerCheckbox.checked)
{
detachEvent(iframe, 'onload', generatedOnLoadEvent)
}
document.body.removeChild(iframe);
iframe = null;
generatedOnLoadEvent = null;
}
function startTest() {
var interval = setInterval(function() {
create();
}, 100);
setTimeout(function() {
clearInterval(interval);
window.log('test complete');
}, 10000);
}
attachEvent(startTestButton, 'onclick', startTest);
}());
</script>
यदि कोई मेमोरी रिसाव नहीं है, तो परीक्षण के चलने के बाद उपयोग की गई मेमोरी लगभग 1000kb या उससे कम बढ़ जाएगी। हालाँकि, यदि स्मृति रिसाव है, तो मेमोरी लगभग 16,000kb बढ़ जाएगी। ईवेंट श्रोता को हटाने से पहले हमेशा कम मेमोरी उपयोग (कोई लीक नहीं) होता है।
परिणाम:
- IE6 - स्मृति रिसाव
- IE7 - स्मृति रिसाव
- IE8 - कोई स्मृति रिसाव
- IE9 - स्मृति रिसाव (???)
- IE10 - स्मृति रिसाव (???)
- IE11 - कोई स्मृति रिसाव नहीं
- एज (20) - कोई मेमोरी लीक नहीं
- Chrome (50) - कोई मेमोरी लीक नहीं है
- फ़ायरफ़ॉक्स (46) - कहना मुश्किल है, बुरी तरह से लीक नहीं करता है, इसलिए शायद सिर्फ अयोग्य कचरा कलेक्टर? बिना किसी स्पष्ट कारण के अतिरिक्त 4MB के साथ खत्म हो जाता है।
- ओपेरा (36) - कोई स्मृति रिसाव नहीं
- सफारी (9) - कोई स्मृति रिसाव नहीं
निष्कर्ष: ब्लीडिंग एज एप्लिकेशन शायद इवेंट श्रोताओं को नहीं हटा सकते हैं। लेकिन मैं अभी भी इसे अच्छी प्रथा मानता हूँ, झुंझलाहट के बावजूद।