কম্পিউটার টিউটোরিয়াল

জাভাস্ক্রিপ্টে মেমোরি লিকের বিস্তারিত ব্যাখ্যা


জাভাস্ক্রিপ্টে মেমোরি লিক

জাভাস্ক্রিপ্ট একটি গারবেজ কালেক্টেড ল্যাঙ্গুয়েজ, অর্থাৎ ভেরিয়েবল ডিক্লেয়ার করলে এটি অটোমেটিক্যালি সেগুলোর জন্য মেমোরি অ্যালোকেট করে। ডিক্লেয়ার করা ভেরিয়েবলগুলোর আর কোনো রেফারেন্স না থাকলে অ্যালোকেট করা মেমোরি রিলিজ হয়। মেমোরি লিক বা অধিকাংশ মেমোরি-সমস্যা মেমোরি রিলিজ করার সময় হয়।

 সাধারণ জাভাস্ক্রিপ্ট লিকগুলো:

 ১) অকস্মাত গ্লোবাল ভেরিয়েবল (Accidental global variables)

যখন একটি অনডিক্লেয়ারড ভেরিয়েবল রেফারেন্স করা হয়, জাভাস্ক্রিপ্ট গ্লোবাল অবজেক্টে একটি নতুন ভেরিয়েবল তৈরি করে। নিচের উদাহরণ-১-এ languages-এর উদ্দেশ্য শুধু "myArray" ফাংশনে একটি ভেরিয়েবল রেফারেন্স করা। যদি var ব্যবহার করে ডিক্লেয়ার না করা হয়, তবে একটি গ্লোবাল ভেরিয়েবল তৈরি হবে। এটি খুব ক্ষতি করবে না, কিন্তু মূল সমস্যা তখন হয় যখন "this" কীওয়ার্ড ব্যবহার করে অকস্মাত একটি গ্লোবাল ভেরিয়েবল তৈরি হয় (উদাহরণ-২)।

উদাহরণ-১

function myArray(arg) {    languages = "[javascript,.....]";  //  created using window }

উদাহরণ-২

function myArray(arg) {    this.languages = "[javascript,.....]";  // global object   }

যেহেতু গ্লোবাল ভেরিয়েবলগুলোর স্কোপ কখনো শেষ হয় না, সেগুলো পেজ এক্সিকিউশন 내내 মেমোরিতে থাকে যদি দরকার নাও হয়। এই পরিস্থিতি গারবেজ কালেক্টরকে (যা ভেরিয়েবল স্কোপ শেষ হলে ডাইনামিক মেমোরি রিমুভ করে) মেমোরি লিক সৃষ্টি করতে বাধ্য করে (অনুপ্রयुक्त অবজেক্ট মেমোরিতে থাকে)। যত বেশি গ্লোবাল ভেরিয়েবল, তত বেশি মেমোরি লিক।

২) ক্লোজার (Closures)

একটি ক্লোজার হলো একটি ইনার ফাংশন যা আউটার ফাংশনের ভেরিয়েবল (স্কোপ) অ্যাক্সেস করতে পারে। בנוסף, আউটার ফাংশন এক্সিকিউট হওয়ার পরেও ইনার ফাংশন আউটার ফাংশনের স্কোপ অ্যাক্সেস করতে থাকে। মেমোরি লিক হয় যখন একটি ডিক্লেয়ারড ভেরিয়েবল অটোমেটিক্যালি ইনার নেস্টেড ফাংশনে উপলব্ধ থাকে এবং সেটি ইনার ফাংশনে রেফারেন্স না থাকলেও মেমোরিতে বসে থাকে।

নিচের উদাহরণে, যেহেতু একটি ক্লোজারের সকল ইনার ফাংশন একই কনটেক্সট শেয়ার করে, innFun() সেই কনটেক্সট শেয়ার করে যা "function() {}" আউটার ফাংশন দ্বারা রিটার্ন করা হয়। এখন, প্রতি ৩ms পরপর outFun-এ ফাংশন কল করলে, প্রতিটি কলে একটি নতুন মান (newvalue) গ্লোবাল ভেরিয়েবলে অ্যাসাইন হয়। যতক্ষণ "function() {}"-এ একটি রেফারেন্স পয়েন্ট করে, শেয়ারড স্কোপ মেইন্টেইন থাকে এবং অ্যারে রাখা থাকে কারণ এটি ইনার ফাংশন (innFun) এর অংশ, যদিও ইনার ফাংশন কখনো কল করা হয় না। আউটার ফাংশন (outFun) কল করার প্রতিবার আমরা পূর্বের function(){} নতুন ফাংশনের ভ্যালু (ভেরিয়েবল) এ সেভ করি। তাই, পূর্বের শেয়ারড স্কোপ রাখতে হয়। সুতরাং, আউটার ফাংশনের nth কল-এ, (n-1)th কলের অ্যারে গারবেজ কালেক্ট করা যায় না। এই প্রক্রিয়া মেমোরি শেষ হওয়া পর্যন্ত চলতে থাকে।

উদাহরণ

var newvalue; function outFun() {    var array = new Array(1000000);    var value = newvalue;       function innFun() {         if (value) return array;    }    return function () {}; } setInterval(function () {    newvalue = outFun();    }, 3);

  1. জাভাস্ক্রিপ্ট ক্লজার কী? উদাহরণসহ ব্যাখ্যা

  2. জাভাস্ক্রিপ্টে ফাংশন প্রোটোটাইপ

  3. জাভাস্ক্রিপ্টে 'Not a constructor function' এরর ব্যাখ্যা

  4. জাভাস্ক্রিপ্টে ফাংশন বরোइং (Function Borrowing)