এখানে তথ্য আপডেট করতে। আমি বিভিন্ন ব্রাউজারগুলি পরীক্ষা করে যাচ্ছি, বিশেষত iframe অনলোড ইভেন্টগুলিতে বৃত্তাকার উপর নির্ভরশীল ইভেন্ট শ্রোতাদের জন্য মেমরি ফাঁসের জন্য।
ব্যবহৃত কোডটি (জেএসফিডাল মেমরি পরীক্ষায় হস্তক্ষেপ করে, তাই এটি পরীক্ষা করতে আপনার নিজের সার্ভারটি ব্যবহার করুন):
<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>
যদি মেমরি ফাঁস না হয় তবে পরীক্ষাগুলি চালানোর পরে ব্যবহৃত মেমরিটি প্রায় 1000 কেবি বা তার বেশি বৃদ্ধি পাবে। যাইহোক, যদি মেমরি ফুটো হয় তবে মেমরিটি প্রায় 16,000 কেবি বৃদ্ধি পাবে। ইভেন্ট শ্রোতার প্রথমে অপসারণের ফলে সর্বদা কম মেমরির ব্যবহার হয় (কোনও ফাঁস হয় না)।
ফলাফল:
- আই 6 - মেমরি ফুটো
- আই 7 - মেমরি ফুটো
- আইই 8 - কোনও স্মৃতি ফাঁস নয়
- আইই 9 - মেমরি ফাঁস (???)
- আইই 10 - মেমরি ফাঁস (???)
- আইই 11 - কোনও স্মৃতি ফাঁস নয়
- প্রান্ত (20) - কোনও মেমরি ফাঁস নয়
- ক্রোম (50) - কোনও মেমরি ফাঁস নয়
- ফায়ারফক্স (46) - বলা মুশকিল, খারাপভাবে ফুটো হয় না, তাই কেবলমাত্র অযোগ্য আবর্জনা সংগ্রহকারী? কোন আপাত কারণে অতিরিক্ত 4MB সঙ্গে শেষ।
- অপেরা (36) - কোনও মেমরি ফাঁস নয়
- সাফারি (9) - কোনও স্মৃতি ফাঁস নয়
উপসংহার: রক্তপাত প্রবাহ অ্যাপ্লিকেশনগুলি সম্ভবত ইভেন্ট শ্রোতাদের অপসারণ না করে দূরে সরে যেতে পারে। তবে আমি বিরক্তি সত্ত্বেও এটি ভাল অভ্যাস বিবেচনা করব।