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

জাভাস্ক্রিপ্টে Mark and Sweep অ্যালগরিদমের বিস্তারিত ব্যাখ্যা


Mark and Sweep অ্যালগরিদম

Mark and Sweep অ্যালগরিদম "যেসব অবজেক্ট অপ্রাপ্য (unreachable)" সেগুলো খুঁজে বের করে, বরং "যেসব অবজেক্ট আর দরকার নেই" সেগুলো না। এটি রেফারেন্স-কাউন্টিং অ্যালগরিদমের উন্নত সংস্করণ।

এই অ্যালগরিদম মূলত ৩টি গুরুত্বপূর্ণ ধাপে কাজ করে:

  • রুট (Root): সাধারণত রুট হলো কোডে ব্যবহৃত একটি গ্লোবাল ভেরিয়েবল। জাভাস্ক্রিপ্টে window অবজেক্ট রুট হিসেবে কাজ করতে পারে। এই অ্যালগরিদম গ্লোবাল অবজেক্ট রুট ব্যবহার করে অবজেক্টগুলো প্রাপ্য (reachable) কিনা তা নির্ধারণ করে।
  • এই অ্যালগরিদম তারপর প্রতিটি রুট এবং তাদের চাইল্ডগুলো মনিটর করে। মনিটরিংয়ের время, প্রদত্ত শর্ত অনুযায়ী কিছু প্রাপ্য অবজেক্ট মার্ক করা হয় এবং বাকি অপ্রাপ্য অবজেক্টগুলো অ্যানমার্কড (unmarked) থাকে।
  • যেসব অবজেক্ট অ্যানমার্কড থাকে, অর্থাৎ অপ্রাপ্য, সেগুলো গারবেজ কালেক্ট হবে।

Mark ফেজ

Mark ফেজে আমরা জানতে পারি কোন এলিমেন্টগুলো মার্কড এবং কোনগুলো অ্যানমার্কড। মনে করুন একটি অবজেক্ট 'obj1'-এ 'hello' নামক একটি প্রপার্টি অ্যাসাইন করা হয়েছে (উদাহরণ-১ দেখুন)। এই অ্যালগরিদম দ্বারা ব্যবহৃত রুট, গ্লোবাল অবজেক্ট, obj1 এবং এর প্রপার্টি 'hello'-এ পৌঁছাতে পারে। তাই এটিকে মার্ক করা হয়।

উদাহরণ-১

var obj1 = { pro1: "hello" // marked because it can be reached by root. }

যদি এই অবজেক্টকে null মান দিয়ে দেওয়া হয় (উদাহরণ-২), তবে নতুন 'null' মার্কড হবে এবং পূর্বের 'hello' প্রপার্টি অ্যানমার্কড হবে। Mark ফেজের শেষে আমরা বলতে পারি: null-এ অ্যাসাইন করা অবজেক্ট মার্কড (প্রাপ্য) এবং 'hello' প্রপার্টি-বালা অবজেক্ট অ্যানমার্কড (অপ্রাপ্য)।

উদাহরণ-২

obj1 = null // null will be marked(reachable) and hello will be unmarked(unreachable)

Sweep ফেজ

নামানুসারে এটি অপ্রাপ্য অবজেক্টগুলো "sweep" করে দেয়। Mark ফেজে আমরা দেখেছি "hello" প্রপার্টি-বালা অবজেক্ট অ্যানমার্কড হয়েছে, অর্থাৎ অপ্রাপ্য। যেহেতু অপ্রাপ্য অবজেক্ট গারবেজ কালেক্ট হয়, এই ফেজে 'hello' প্রপার্টি-বালা অবজেক্ট গারবেজ কালেক্ট হবে।

Mark and Sweep অ্যালগরিদমকে ট্রেসিং গারবেজ কালেক্টরও বলা হয় কারণ এটি প্রোগ্রাম দ্বারা সরাসরি বা পরোক্ষভাবে অ্যাক্সেসযোগ্য সব অবজেক্ট ট্রেস করে।

সাইকেল (Cycles) আর সমস্যা নয়

নিচের উদাহরণে, ফাংশন কল রিটার্ন করলে দুটি অবজেক্ট obj1 এবং obj2 যেকোনো প্রাপ্য জিনিস দ্বারা রেফারেন্সড নেই, তাই সেগুলো গারবেজ কালেকশনের যোগ্য। গারবেজ কালেক্টর obj1 এবং obj2-এর মেমোরি ফ্রি করবে।

উদাহরণ

function f() { var obj1 = {}; var obj2 = {}; obj1.p = obj2; // obj1 references obj2 obj2.p = obj1; // obj2 references obj1. This creates a cycle. } f();

সীমাবদ্ধতা

কিছু মুহূর্ত থাকে যখন ম্যানুয়ালি ডিসাইড করা সুবিধাজনক যে কখন এবং কোন মেমোরি রিলিজ হবে। একটি অবজেক্টের মেমোরি রিলিজ করতে হলে সেটিকে এক্সপ্লিসিটলি অপ্রাপ্য (explicitly unreachable) করতে হয়। জাভাস্ক্রিপ্টে গারবেজ কালেকশন এক্সপ্লিসিটলি ট্রিগার করার প্রক্রিয়া এখনো সম্ভব নয়।


  1. জাভাস্ক্রিপ্টে try এবং catch স্টেটমেন্ট উদাহরণসহ ব্যাখ্যা

  2. জাভাস্ক্রিপ্টে import "as" এবং export "as" কনস্ট্রাক্ট

  3. জাভাস্ক্রিপ্টে সাব-অবজেক্ট ও অ্যারে সহ অবজেক্ট ইমপোর্ট করা

  4. জাভাস্ক্রিপ্টে অবজেক্ট সমতা ব্যাখ্যা