ভুলে যাওয়া টাইমার/কলব্যাক
জাভাস্ক্রিপ্টে দুটি টাইমিং ইভেন্ট রয়েছে: setTimeout() এবং setInterval()। প্রথমটি নির্দিষ্ট মিলিসেকেন্ড انتظار করার পর একটি ফাংশন এক্সিকিউট করে, দ্বিতীয়টি περιοডিক্যালি (নির্দিষ্ট সময় ব্যবধানে) ফাংশন এক্সিকিউট করে।
যখন কোনো অবজেক্ট টাইমার কলব্যাকের সাথে বাঁধা থাকে, তবে টাইমআউট হওয়া পর্যন্ত তা রিলিজ হয় না। এই পরিস্থিতিতে টাইমার নিজে রিসেট করে এবং টাইমআউট কমপ্লিট होने পর্যন্ত চলে, ফলে গার্বেজ কলেক্টর মেমোরি রিমুভ করতে পারে না। এই টাইমারগুলো জাভাস্ক্রিপ্টে মেমোরি লিকের সবচেয়ে যাবতীয় কারণ।
উদাহরণ
<html> <body>
<script>
for (var i = 0; i < 100000; i++) {
var tiedObject = {
callAgain: function() {
var text = this;
var value = setTimeout(function() {
text.callAgain();
}, 100000);
}
}
tiedObject.callAgain();
tiedObject = null;
}
</script>
</body>> </html>
উপরের উদাহরণে, টাইমার কলব্যাক এবং এর সাথে বাঁধা অবজেক্ট (tiedObject) টাইমআউট ফিনিশ হওয়া পর্যন্ত রিলিজ হবে না। মিনিটমধ্যে টাইমার নিজে রিসেট করে এবং চিরকাল চলে, ফলে এর মেমোরি স্পেস কদাচিৎ কলেক্ট হবে না এমনকি অরিজিনাল অবজেক্টের কোনো রেফারেন্স না থাকলেও।
মেমোরি লিক এড়ানোর উপায়
setInterval()/setTimeout()-এ রেফারেন্স প্রদান করুন যাতে ফাংশনগুলো গার্বেজ কালেক্ট হওয়ার আগে এক্সিকিউট হতে পারে।- যখন ফাংশনগুলো আর দরকার নেই, তখন সরাসরি কল করে রিমুভ করুন।
পুরনো ব্রাউজার (যেমন IE) বাদে, অধিকাংশ আধুনিক ব্রাউজার (ক্রোম ইত্যাদি) এই ধরনের সমস্যা মুখোমুখি হয় না। আরো গুরুত্বপূর্ণ, jQuery-এর মতো লাইব্রেরিগুলো ইন্টারন্যালি হ্যান্ডেল করে যাতে লিক সমস্যা তৈরি না হয়।