মার্ক এবং সুইপ অ্যালগরিদম
মার্ক এবং সুইপ অ্যালগরিদম বস্তুর 'যার আর প্রয়োজন নেই' বস্তুর পরিবর্তে 'যা নাগালযোগ্য' বস্তুর সন্ধান করে। এই অ্যালগরিদম হল রেফারেন্স-কাউন্টিং অ্যালগরিদমের উন্নতি৷
৷এই অ্যালগরিদমটি আসলে 3টি গুরুত্বপূর্ণ ধাপের মধ্য দিয়ে যায়।
- রুট:সাধারণভাবে, একটি রুট একটি বিশ্বব্যাপী চলক যা কোডে ব্যবহৃত হয়। জাভাস্ক্রিপ্টে একটি উইন্ডো অবজেক্ট রুট হিসাবে কাজ করতে পারে। এই অ্যালগরিদম গ্লোবাল অবজেক্ট রুট ব্যবহার করে অবজেক্টগুলি পৌঁছানো যায় না নাগাল হয় কিনা তা খুঁজে বের করতে৷
- এই অ্যালগরিদম তারপর প্রতিটি রুট এবং তাদের বাচ্চাদেরও নিরীক্ষণ করে। নিরীক্ষণ করার সময়, কিছু জিনিস যা পৌঁছানো যায় তা চিহ্নিত করা হয় এবং অবশিষ্ট বস্তুগুলি যা পৌঁছানো যায় না, প্রদত্ত শর্তের ভিত্তিতে চিহ্নিত করা হয় না।
- যে বস্তুগুলিকে চিহ্নিত করা হয়নি, মানে যেগুলি পৌঁছানো যায় না সেগুলি আবর্জনা সংগ্রহ করা হবে।
মার্ক ফেজ
মার্ক ফেজে আমরা খুঁজে পেতে পারি কোন উপাদানগুলো চিহ্নিত এবং কোনটি অচিহ্নিত। ধরুন, প্রদত্ত উদাহরণ-1-এ দেখানো একটি বস্তু 'obj1'-এ একটি প্রপার্টি 'hello' বরাদ্দ করা যাক। এই অ্যালগরিদম দ্বারা ব্যবহৃত রুট, গ্লোবাল অবজেক্ট, obj1 এবং এর প্রপার্টি 'হ্যালো'-তে পৌঁছাতে পারে। তাই এটি এখন চিহ্নিত করা হয়েছে৷
৷উদাহরণ-1
var obj1 = { pro1: "hello" // marked because it can be reached by root. }
ধরুন এই বস্তুটিকে উদাহরণ-২-এ দেখানো হিসাবে একটি নাল মান নির্ধারণ করা যাক। তারপর নতুন নিয়োগ করা 'নাল' চিহ্নিত করা হবে এবং পূর্বে নির্ধারিত 'প্রপার্টি হ্যালো' চিহ্নিত করা হবে না। সুতরাং মার্ক পর্বের শেষে আমরা উপসংহারে পৌঁছাতে পারি যে 'নাল' দিয়ে বরাদ্দ করা বস্তুটি চিহ্নিত হয়ে গেছে এবং 'প্রপার্টি হ্যালো' দিয়ে বরাদ্দ করা বস্তুটি চিহ্নিত করা হয়নি।
উদাহরণ-2
obj1 = null // null will be marked(reachable) and hello will be unmarked(unreachable)
সুইপ ফেজ
নামটিই বোঝায় যে এটি নাগালযোগ্য বস্তুগুলিকে 'সুইপ' করে। মার্ক ফেজে আমরা দেখেছি যে "সম্পত্তি হ্যালো" সহ বস্তুটি অচিহ্নিত হয়ে গেছে, এটিকে পৌঁছানো যায় না। যেহেতু নাগালযোগ্য বস্তুগুলি আবর্জনা সংগ্রহ করা হবে, তাই 'প্রপার্টি হ্যালো' সহ বস্তুটি এই পর্বে আবর্জনা সংগ্রহ করা হবে৷
মার্ক এবং সুইপ অ্যালগরিদমকে ট্রেসিং আবর্জনা সংগ্রাহক হিসাবেও ডাকা হয় কারণ এটি প্রোগ্রাম দ্বারা প্রত্যক্ষ বা পরোক্ষভাবে অ্যাক্সেসযোগ্য বস্তুর সম্পূর্ণ সংগ্রহ খুঁজে বের করে।
সাইকেল আর কোন সমস্যা নয়
নিম্নলিখিত উদাহরণে, যখন ফাংশন কল রিটার্ন করে, তখন দুটি বস্তু 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();
সীমাবদ্ধতা
কিছু মুহূর্ত আছে যখন ম্যানুয়ালি সিদ্ধান্ত নেওয়া খুব সুবিধাজনক যে কখন এবং কী মেমরি প্রকাশিত হবে। বস্তুর স্মৃতিকে মুক্ত করার জন্য, এটিকে স্পষ্টভাবে অগম্য করে তুলতে হবে। জাভাস্ক্রিপ্টে আবর্জনা সংগ্রহকে স্পষ্টভাবে ট্রিগার করার এই প্রক্রিয়াটি এখন সম্ভব নয়৷