কম্পিউটার

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


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

জাভাস্ক্রিপ্টকে আবর্জনা সংগ্রহ করা ভাষা বলা হয়, যখন ভেরিয়েবল ঘোষণা করা হয়, এটি স্বয়ংক্রিয়ভাবে তাদের মেমরি বরাদ্দ করবে। ঘোষিত ভেরিয়েবলের জন্য আর কোন রেফারেন্স না থাকলে, বরাদ্দ করা মেমরি প্রকাশ করা হবে। মেমরি রিলিজ করার সময় মেমরি লিক বা মেমরি সম্পর্কিত বেশিরভাগ সমস্যা দেখা দেবে।

কিছু সাধারণ জাভাস্ক্রিপ্ট লিক

1) দুর্ঘটনাজনিত গ্লোবাল ভেরিয়েবল

যখন একটি অঘোষিত ভেরিয়েবল রেফারেন্স করা হয়, তখন জাভাস্ক্রিপ্ট গ্লোবাল অবজেক্টে একটি নতুন ভেরিয়েবল তৈরি করে। নিম্নলিখিত উদাহরণ-1-এ ধরা যাক ভাষার উদ্দেশ্য হল শুধুমাত্র "myArray" ফাংশনে একটি পরিবর্তনশীল উল্লেখ করা। আমরা যদি var ব্যবহার না করি তবে এটিকে একটি বিশ্বব্যাপী পরিবর্তনশীল ঘোষণা করা হবে। এটি খুব বেশি ক্ষতি নাও করতে পারে, তবে মূল সমস্যাটি দেখা দেয় যখন ভুলবশত "এই" কীওয়ার্ড ব্যবহার করে একটি গ্লোবাল ভেরিয়েবল তৈরি হয় যা উদাহরণ-2-তে দেখানো হয়েছে।

উদাহরণ-1

function myArray(arg) {
   languages = "[javascript,.....]";  //  created using window
}
ব্যবহার করে তৈরি

উদাহরণ-2

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

যেহেতু, গ্লোবাল ভেরিয়েবলের স্কোপ কখনই শেষ হয় না, সেগুলি প্রয়োজন না হলেও পৃষ্ঠার সম্পাদনের সময় মেমরিতে থাকে৷ এই দৃশ্যটি আবর্জনা সংগ্রাহক তৈরি করে, যা একটি পরিবর্তনশীল স্কোপ শেষ হলে গতিশীল মেমরিকে সরিয়ে দেয়, একটি মেমরি ফুটো তৈরি করতে (অব্যবহৃত মেমরিতে অবশিষ্ট বস্তু)। গ্লোবাল ভেরিয়েবল যত বেশি, মেমরি লিকেজ তত বেশি।

2) বন্ধ

ক্লোজার হল একটি অভ্যন্তরীণ ফাংশন যা বাইরের ফাংশনের ভেরিয়েবল (স্কোপ) অ্যাক্সেস করতে পারে। এছাড়াও, বাইরের ফাংশনটি কার্যকর হওয়ার পরেও ভিতরের ফাংশনটি বাইরের ফাংশনের সুযোগে অ্যাক্সেস অব্যাহত রাখবে৷ একটি মেমরি লিক ঘটে যখন একটি ঘোষিত ভেরিয়েবল অভ্যন্তরীণ নেস্টেড ফাংশনে স্বয়ংক্রিয়ভাবে উপলব্ধ হয় এবং এটি উল্লেখ না থাকা সত্ত্বেও একটি মেমরিতে থাকে৷ ভিতরের নেস্টেড ফাংশন।

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

উদাহরণ

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. জাভাস্ক্রিপ্টে 'একটি কনস্ট্রাক্টর ফাংশন নয়' ত্রুটি ব্যাখ্যা করুন?

  4. জাভাস্ক্রিপ্টে ফাংশন ধার করা।