আপনি সঠিক. আপনার বর্ণনা করা আবর্জনা সংগ্রহের নির্দিষ্ট ফর্মটিকে " রেফারেন্স কাউন্টিং " বলা হয় । সহজ পদ্ধতিতে এটি যেভাবে কাজ করে (ধারণাগতভাবে, কমপক্ষে, আধুনিকতম রেফারেন্স গণনার বাস্তবায়নগুলি বেশ কিছুটা ভিন্নভাবে বাস্তবায়িত হয়) এটি দেখতে এইরকম দেখাচ্ছে:
- যখনই কোনও বস্তুর রেফারেন্স যুক্ত করা হয় (যেমন এটি কোনও ভেরিয়েবল বা ক্ষেত্রের জন্য বরাদ্দ করা হয়, পদ্ধতিতে পাস করা হয়, ইত্যাদি), এর রেফারেন্স গণনাটি 1 দ্বারা বৃদ্ধি করা হয়
- যখনই কোনও জিনিসের রেফারেন্স সরিয়ে ফেলা হয় (পদ্ধতিটি ফিরে আসে, পরিবর্তনশীল সুযোগের বাইরে চলে যায়, ক্ষেত্রটি আবার আলাদা আলাদা বস্তুর কাছে অর্পণ করা হয় বা যে বস্তুটিতে ক্ষেত্রটি থাকে সেগুলি আবর্জনা সংগ্রহ করে), রেফারেন্স গণনাটি 1 দ্বারা হ্রাস পেয়েছে
- যত তাড়াতাড়ি রেফারেন্স গণনা 0 টি আসে, অবজেক্টটির আর কোনও রেফারেন্স নেই, যার অর্থ কেউ এটিকে আর ব্যবহার করতে পারে না, তাই এটি আবর্জনা এবং সংগ্রহ করা যায়
এবং এই সাধারণ কৌশলটি হ'ল আপনার ডিক্রিবিইর সমস্যাটি: যদি A এবং B এবং B রেফারেন্স এ হিসাবে উল্লেখ করা হয় তবে তাদের উভয় রেফারেন্স গণনা কখনই 1 এর চেয়ে কম হতে পারে না , যার অর্থ তারা কখনই সংগ্রহ করবেন না।
এই সমস্যাটি মোকাবেলার জন্য চারটি উপায় রয়েছে:
- বাদ দাও. আপনার যদি পর্যাপ্ত স্মৃতি থাকে তবে আপনার চক্রগুলি ছোট এবং খুব কম এবং আপনার রানটাইমটি খুব কম, সম্ভবত আপনি চক্রটি সংগ্রহ না করেই পালিয়ে যেতে পারেন। শেল স্ক্রিপ্ট দোভাষী সম্পর্কে চিন্তা করুন: শেল স্ক্রিপ্টগুলি সাধারণত কয়েক সেকেন্ডের জন্য চালিত হয় এবং বেশি মেমরি বরাদ্দ দেয় না।
- অন্যের সাথে আপনার রেফারেন্স গণনা আবর্জনা সংগ্রহকারী একত্রিত করুন যার চক্র নিয়ে সমস্যা নেই। সিপিথন এটি করে, উদাহরণস্বরূপ: সিপিথনের মূল আবর্জনা সংগ্রহকারী একটি রেফারেন্স গণনা সংগ্রাহক, কিন্তু সময়ে সময়ে চক্র সংগ্রহের জন্য একটি ট্রেসিং আবর্জনা সংগ্রহকারী চালানো হয়।
- চক্রগুলি সনাক্ত করুন। দুর্ভাগ্যক্রমে, একটি গ্রাফে চক্র সনাক্তকরণ একটি ব্যয়বহুল অপারেশন। বিশেষত, এটির জন্য অনেকগুলি একই ওভারহেডের দরকার হয় যা একটি ট্রেসিং সংগ্রাহক করতে পারে, সুতরাং আপনি সেইগুলির মধ্যে একটিও ব্যবহার করতে পারেন।
- আপনি এবং আমি যেভাবে নিখুঁতভাবে অ্যালগরিদমটি বাস্তবায়ন করবেন না: ১৯ since০-এর দশক থেকে, একাধিক বেশ আকর্ষণীয় অ্যালগোরিদম বিকাশিত হয়েছে যেগুলি চক্র সনাক্তকরণ এবং রেফারেন্স গণনাটিকে একটি চৌকস উপায়ে একত্রিত করে যা সেগুলি করার চেয়ে উল্লেখযোগ্যভাবে সস্তা either উভয় পৃথকভাবে বা একটি ট্রেসিং সংগ্রাহক করছেন।
যাইহোক, কোনও আবর্জনা সংগ্রহকারীকে বাস্তবায়নের জন্য অন্যান্য বড় উপায় (এবং আমি ইতিমধ্যে উপরের দু'বার ইঙ্গিত দিয়েছি), এটি সন্ধান করছে । একটি ট্রেসিং সংগ্রাহক পুনঃচঞ্চলতার ধারণার উপর ভিত্তি করে । আপনি কিছু সাথে শুরু রুট সেট আপনি কি জানেন যে সবসময় পৌঁছানো (গ্লোবাল ধ্রুবক, উদাহরণস্বরূপ, বা Object
বর্গ, বর্তমান আভিধানিক সুযোগ, বর্তমান স্ট্যাক ফ্রেম) এবং থেকে সেখানে আপনি ট্রেস সমস্ত বস্তু যে রুট সেট থেকে পৌঁছানো হয়, তারপর রুট সেট থেকে অ্যাক্সেসযোগ্য সমস্ত বস্তুগুলি এবং আপনার যেমন ট্রানজিটিভ ক্লোজার না পাওয়া পর্যন্ত। সবকিছু যে না যে অবসান আবর্জনা হয়।
যেহেতু একটি চক্র কেবলমাত্র নিজের মধ্যে পৌঁছতে পারে তবে মূল সেট থেকে পৌঁছনীয় নয়, এটি সংগ্রহ করা হবে।