আবর্জনা সংগ্রহ করা ভাষায় ফাঁসের প্রধান কারণ হল অবাঞ্ছিত রেফারেন্স। মেমরি লিক বোঝার জন্য, আসুন দেখি কিভাবে মেমরি ফ্রি করা (আবর্জনা সংগ্রহ) কাজ করে।
মার্ক-এন্ড-সুইপ অ্যালগরিদম −এই অ্যালগরিদমটি "একটি বস্তুর আর প্রয়োজন নেই" এর সংজ্ঞাকে "একটি বস্তু পৌঁছানো যায় না" এ কমিয়ে দেয়। এই অ্যালগরিদম রুট নামক বস্তুর একটি সেটের জ্ঞান অনুমান করে। জাভাস্ক্রিপ্টে, রুট হল গ্লোবাল অবজেক্ট। পর্যায়ক্রমে, GC এই শিকড়গুলি থেকে শুরু হয়, এই শিকড়গুলি থেকে রেফারেন্স করা সমস্ত বস্তুকে বারবার খুঁজে বের করুন। শিকড় থেকে শুরু করে, GC এইভাবে সমস্ত নাগালযোগ্য বস্তুগুলি খুঁজে পাবে এবং সমস্ত অ-পৌছায়যোগ্য বস্তু সংগ্রহ করবে৷
মেমরি লিক এর প্রকারগুলি
1. গ্লোবাল ভেরিয়েবল (অঘোষিত/দুর্ঘটনাজনিত)
JS-এ, আপনি একটি ভেরিয়েবল বিশ্বব্যাপী ঘোষণা করতে পারেন যদি আপনি একটি ঘোষণা কীওয়ার্ড (লেট, ভার, কনস্ট) নির্দিষ্ট না করেন। JS যতক্ষণ না এটি গ্লোবাল স্কোপে পৌঁছায় ততক্ষণ পর্যন্ত স্কোপের বাইরে যেতে দেখায় এবং যদি এটি কোনো স্কোপে ভেরিয়েবল খুঁজে না পায়, তাহলে এটি একটি গ্লোবাল ভেরিয়েবল তৈরি করে।
উদাহরণ
function test() { a = [1, 2, 3] } test() // a was initialized without declaration using a keyword and is now in the global scope. console.log(a)
আউটপুট
[1, 2, 3]
এই আচরণটি মেমরি ফাঁসের কারণ হতে পারে কারণ ভেরিয়েবলগুলি অজান্তেই গ্লোবাল স্কোপে উপস্থিত থাকে এবং প্রোগ্রামটি শেষ না হওয়া পর্যন্ত মুক্ত করা হবে না। এটি একটি ঘোষণা কীওয়ার্ড ব্যবহার করে ঠিক করা যেতে পারে।
২. বন্ধ
একটি মেমরি লিক একটি বন্ধে ঘটে যদি একটি ভেরিয়েবল বাইরের ফাংশনে ঘোষণা করা হয় এবং এটি নেস্টেড অভ্যন্তরীণ ফাংশনে স্বয়ংক্রিয়ভাবে উপলব্ধ হয়ে যায় এবং নেস্টেড ফাংশনে এটি ব্যবহার/রেফারেন্স না থাকলেও মেমরিতে থাকে৷
3. বিচ্ছিন্ন DOM/DOM রেফারেন্সের বাইরে
DOM হল একটি দ্বিগুণ-সংযুক্ত গাছ, গাছের যেকোন নোডের রেফারেন্স থাকলে পুরো গাছটিকে আবর্জনা সংগ্রহ করা থেকে বিরত রাখবে। বিচ্ছিন্ন DOM বা আউট অফ DOM রেফারেন্স মানে যে নোডগুলি DOM থেকে সরানো হয়েছে কিন্তু JS এর মাধ্যমে মেমরিতে রয়েছে। এর মানে হল যে যতক্ষণ পর্যন্ত কোনও ভেরিয়েবল বা কোনও বস্তুর কোথাও একটি রেফারেন্স নেই, ততক্ষণ পর্যন্ত সেই বস্তুটি DOM থেকে সরানোর পরেও আবর্জনা সংগ্রহ করা হয় না। DOM-এর কিছু অংশের কাজ শেষ হয়ে গেলে সর্বদা JS থেকে রেফারেন্স মুছে ফেলুন।
4. ইভেন্ট লিসেনারস
addEventListener() পদ্ধতিটি একটি ইভেন্ট হ্যান্ডলারকে একটি উপাদানের সাথে সংযুক্ত করে এবং একাধিক ইভেন্ট হ্যান্ডলার একটি একক উপাদানে যোগ করা যেতে পারে। যদি একটি DOM উপাদান এবং এর ইভেন্ট শ্রোতার একই জীবনচক্র না থাকে, তাহলে এটি একটি মেমরি লিক হতে পারে৷