গার্বেজ কালেক্টেড ল্যাঙ্গুয়েজে লিকের মূল কারণ হলো অনিচ্ছাকৃত রেফারেন্স। মেমরি লিক বুঝতে হলে মেমরি ফ্রিイング (গার্বেজ কালেকশন) কীভাবে কাজ করে সেটা দেখতে হবে।
মার্ক-অ্যান্ড-স্বিপ অ্যালগরিদম − এই অ্যালগরিদম "একটি অবজেক্ট আর দরকার নেই" এর ডেফিনিশনকে "একটি অবজেক্ট অরিয়achable নয়" এ রিডিউস করে। এই অ্যালগরিদম কিছু রুট অবজেক্টের নলেজ অনুমান করে। জাভাস্ক্রিপ্টে, রুট হলো গ্লোবাল অবজেক্ট। পিরিয়ডিক্যালি, GC এই রুট থেকে শুরু করে, এই রুট থেকে রেফারেন্স করা সব অবজেক্ট খুঁজে বের করে, রিকার্সিভলি। রুট থেকে শুরু করে, GC এইভাবে সব রিচেয়achable অবজেক্ট খুঁজে পায় এবং নন-রিচেয়achable অবজেক্টগুলো কালেক্ট করে।
মেমরি লিকের প্রকার
১. গ্লোবাল ভেরিয়েবল (অনডিক্লেয়ারড/অ্যাক্সিডেন্টাল)
জেএসে, আপনি যদি ডিক্লেরেশন কীওয়ার্ড (let, var, const) না দিয়ে ভেরিয়েবল ডিক্লেয়ার করেন তবে এটি অকস্মাত গ্লোবালভাবে ডিক্লেয়ার হয়। JS স্কোপ থেকে বাইরে সার্চ করে গ্লোবাল স্কোপ পর্যন্ত যায় এবং যদি কোনো স্কোপে ভেরিয়েবল না পায়, তবে একটি গ্লোবাল ভেরিয়েবল তৈরি করে।
উদাহরণ
function test() { a = [1, 2, 3] } test() // a ডিক্লেরেশন কীওয়ার্ড ছাড়া ইনিশিয়ালাইজ হয়েছে এবং এখন গ্লোবাল স্কোপে আছে। console.log(a)আউটপুট
[1, 2, 3]
এই বিহেভিয়র মেমরি লিকের কারণ হতে পারে কারণ ভেরিয়েবল অজানে গ্লোবাল স্কোপে থাকে এবং প্রোগ্রাম শেষ না হওয়া পর্যন্ত ফ্রি হয় না। এটি ডিক্লেরেশন কীওয়ার্ড ব্যবহার করে ফিক্স করা যায়।
২. ক্লোজার
একটি ক্লোজারে মেমরি লিক হয় যদি আউটার ফাংশনে একটি ভেরিয়েবল ডিক্লেয়ার করা থাকে এবং সেটি নেস্টেড ইনার ফাংশনে অটোমেটিক্যালি উপলব্ধ হয়ে যায় এবং সেটি নেস্টেড ফাংশনে ব্যবহার/রেফারেন্স না হলেও মেমরিতে থাকে।
৩. ডিটাচড DOM/আউট অফ DOM রেফারেন্স
DOM একটি ডাবলি-লিঙ্কড ট্রি, ট্রিতে যেকোনো নোডের রেফারেন্স থাকলে পুরো ট্রি গার্বেজ কালেকশন থেকে বাধা পায়। ডিটাচড DOM বা আউট অফ DOM রেফারেন্স মানে যে নোডগুলো DOM থেকে রিমুভ হয়েছে কিন্তু JS দিয়ে মেমরিতে আছে। এর মানে যতক্ষণ যেকোনো জায়গায় ভেরিয়েবল বা অবজেক্টের রেফারেন্স আছে, ততক্ষণ সেই অবজেক্ট গার্বেজ কালেক্টেড হবে না DOM থেকে রিমুভ হওয়ার পরেও। DOMের অংশটুকু শেষ হলে JS থেকে রেফারেন্স রিমুভ করুন।
৪. ইভেন্ট লিসেনার
addEventListener() মেথড একটি এলিমেন্টে ইভেন্ট হ্যান্ডলার আটাচ করে এবং একটি এলিমেন্টে একাধিক ইভেন্ট হ্যান্ডলার যোগ করা যায়। যদি একটি DOM এলিমেন্ট এবং এর ইভেন্ট লিসেনারের একই লাইফসাইকেল না হয়, তবে এটি মেমরি লিকের দিকে নিয়ে যেতে পারে।