সংক্ষেপে
চূড়ান্তকরণ কোনও আবর্জনা সংগ্রহকারীদের দ্বারা পরিচালিত হওয়া সাধারণ বিষয় নয়। রেফারেন্স গণনা জিসির সাথে এটি ব্যবহার করা সহজ, তবে জিসির এই পরিবারটি প্রায়শই অসম্পূর্ণ থাকে যার ফলে কিছু বস্তু এবং কাঠামোর ধ্বংস এবং চূড়ান্তকরণের স্পষ্ট ট্রিগার দ্বারা মেমরি ফাঁসের ক্ষতিপূরণ করা প্রয়োজন। আবর্জনা সংগ্রহকারীদের সন্ধান করা আরও কার্যকর, তবে কেবল অব্যবহৃত স্মৃতি চিহ্নিতকরণের বিপরীতে চূড়ান্ত ও ধ্বংস হওয়া অবজেক্টটি সনাক্ত করা অনেক বেশি শক্ত করে তোলে, এইভাবে সময় ও স্থান ব্যয় সহ আরও জটিল পরিচালনা প্রয়োজন of রুপায়ণ.
ভূমিকা
আমি ধরে নিয়েছি যে আপনি যা জিজ্ঞাসা করছেন তা হ'ল আবর্জনা সংগ্রহ করা ভাষাগুলি কেন আবর্জনা সংগ্রহের প্রক্রিয়াটির মধ্যে স্বয়ংক্রিয়ভাবে ধ্বংস / চূড়ান্তকরণ পরিচালনা করে না, মন্তব্য দ্বারা নির্দেশিত হিসাবে:
আমি এটি অত্যন্ত অভাব বোধ করি যে এই ভাষাগুলি মেমরিকে পরিচালনা করার উপযুক্ত একমাত্র উত্স হিসাবে বিবেচনা করে। সকেট, ফাইল হ্যান্ডলগুলি, অ্যাপ্লিকেশনের রাজ্যগুলির সম্পর্কে কী?
আমি kdbanman প্রদত্ত গৃহীত উত্তরের সাথে একমত নই । যদিও সেখানে বর্ণিত তথ্যগুলি বেশিরভাগই সঠিক, যদিও রেফারেন্স গণনার পক্ষে দৃ strongly় পক্ষপাতদুষ্ট, আমি বিশ্বাস করি না যে তারা প্রশ্নের মধ্যে অভিযোগ করা পরিস্থিতি সঠিকভাবে ব্যাখ্যা করেছে।
আমি বিশ্বাস করি না যে উত্তরটিতে যে পরিভাষাটি বিকশিত হয়েছে তা একটি ইস্যুতে অনেক বেশি, এবং বিষয়গুলিকে বিভ্রান্ত করার সম্ভাবনা বেশি। প্রকৃতপক্ষে, যেমন উপস্থাপন করা হয়েছে, পরিভাষাগুলি বেশিরভাগ ক্ষেত্রে কীভাবে করা হয় তার চেয়ে পদ্ধতিগুলি সক্রিয় করার পদ্ধতি দ্বারা নির্ধারিত হয়। মুল বক্তব্যটি হ'ল সমস্ত ক্ষেত্রে, কোনও ক্লিনআপ প্রক্রিয়া ব্যবহার করে আর কোনও জিনিস চূড়ান্ত করার প্রয়োজন নেই এবং এটি যে যা সংস্থান ব্যবহার করে চলেছে তা মুক্ত করার জন্য, স্মৃতি কেবল তাদের মধ্যে একটি। আদর্শভাবে, যখন আবর্জনা আর ব্যবহার করা যায় না তখন সমস্ত কিছুই স্বয়ংক্রিয়ভাবে করা উচিত, কোনও আবর্জনা সংগ্রাহকের মাধ্যমে। অনুশীলনে, জিসি নিখোঁজ হতে পারে বা তার ঘাটতি থাকতে পারে এবং চূড়ান্তকরণ এবং পুনঃসংশ্লিষ্টকরণের প্রোগ্রামটি দ্বারা স্পষ্ট ট্রিগার দ্বারা এটির ক্ষতিপূরণ দেওয়া হয়।
প্রোগ্রামটির দ্বারা স্পষ্ট ট্রিগারিং একটি সমস্যা হ'ল এটি যখন প্রোগ্রামিং ত্রুটিগুলি বিশ্লেষণের পক্ষে কঠোরভাবে মঞ্জুরি দেয় তখন যখন ব্যবহারে থাকা কোনও বস্তুটি স্পষ্টভাবে বন্ধ হয়ে যায়।
সুতরাং রিসোর্সগুলি দাবি করতে স্বয়ংক্রিয় আবর্জনা সংগ্রহের উপর নির্ভর করা আরও ভাল। তবে দুটি বিষয় রয়েছে:
কিছু আবর্জনা সংগ্রহের কৌশল মেমরির ফুটোকে অনুমতি দেয় যা সম্পদের পুরো পুনরুদ্ধার প্রতিরোধ করে। এটি রেফারেন্স গণনা জিসির জন্য সুপরিচিত, তবে যত্ন ছাড়াই কিছু ডেটা সংগঠন ব্যবহার করার সময় অন্যান্য জিসি কৌশলগুলির জন্য উপস্থিত হতে পারে (পয়েন্টটি এখানে আলোচনা করা হয়নি)।
জিসি কৌশলটি মেমোরি সংস্থানগুলি আর ব্যবহার না করে সনাক্তকরণে ভাল হতে পারে, তবে এতে থাকা বিষয়গুলি চূড়ান্ত করা সহজ নাও হতে পারে এবং যা এই বিষয়গুলি দ্বারা ব্যবহৃত অন্যান্য সংস্থানগুলি পুনরায় দাবি করার সমস্যাটিকে জটিল করে তোলে, যা প্রায়শই চূড়ান্তকরণের উদ্দেশ্য।
পরিশেষে, একটি গুরুত্বপূর্ণ বিষয় যা প্রায়শই ভুলে যায় তা হ'ল জিসি চক্রগুলি কোনও কিছুর দ্বারাই ট্রিগার হতে পারে, কেবল স্মৃতির ঘাটতি নয়, যদি সঠিক হুক সরবরাহ করা হয় এবং যদি কোনও জিসি চক্রের ব্যয়টিকে মূল্য হিসাবে বিবেচনা করা হয়। সুতরাং কোনও প্রকার মুক্ত করার আশায় যখন কোনও ধরণের সংস্থান অনুপস্থিত থাকে তখন কোনও জিসি শুরু করা পুরোপুরি ঠিক।
আবর্জনা সংগ্রহকারীদের গণনা রেফারেন্স
রেফারেন্স গণনা দুর্বল আবর্জনা সংগ্রহের কৌশল , যা চক্রগুলি সঠিকভাবে পরিচালনা করবে না। অপ্রচলিত কাঠামো ধ্বংস করতে এবং স্মৃতি পুনরুদ্ধার করার ক্ষেত্রে এটি দুর্বল হওয়ায় অন্য সংস্থানগুলি পুনরায় দাবি করার জন্য এটি সত্যই দুর্বল হবে। তবে ফাইনালাইজারগুলি রেফারেন্স গণনা আবর্জনা সংগ্রহকারী (জিসি) দিয়ে খুব সহজেই ব্যবহার করা যেতে পারে, যেহেতু একটি রেফ-কাউন্ট জিসি কোনও কাঠামো পুনরায় দাবি করে যখন তার রেফ গণনাটি 0 এ নেমে যায়, সেই সময়ে তার ঠিকানাটি তার ধরণের সাথে একসাথে জানা থাকে, হয় স্থিতিশীলভাবে বা গতিশীল। সুতরাং যথাযথ চূড়ান্তকরণকারী প্রয়োগের পরে এবং সঠিকভাবে চূড়ান্তভাবে সমস্ত দৃষ্টিকোণ বস্তুগুলিতে কল করা (সম্ভবত চূড়ান্তকরণ পদ্ধতির মাধ্যমে) মেমরিটিকে পুনরায় দাবি করা সম্ভব।
সংক্ষেপে বলা যায়, রেফ কাউন্টিং জিসির মাধ্যমে চূড়ান্তকরণ কার্যকর করা সহজ, তবে স্মৃতি পুনরুদ্ধারের যে মাত্রা ভুগছে ঠিক তেমনই সেই জিসির "অসম্পূর্ণতা" দ্বারা ভোগেন। অন্য কথায়, রেফারেন্স গণনা সহ, স্মৃতি হ'ল সকেট, ফাইল হ্যান্ডেল ইত্যাদির মতো অন্যান্য সংস্থাগুলির মতো খারাপভাবে পরিচালিত হয়
প্রকৃতপক্ষে, রেফ কাউন্ট জিসি লুপিং স্ট্রাকচারগুলি (সাধারণভাবে) পুনরায় দাবি করতে অক্ষমতা মেমরি ফাঁস হিসাবে দেখা যেতে পারে । আপনি সমস্ত জিসি মেমরি ফুটো এড়ানোর আশা করতে পারবেন না। এটি জিসি অ্যালগরিদমের উপর নির্ভর করে, এবং টাইপ স্ট্রাকচারের তথ্যগুলিতে গতিশীলভাবে উপলব্ধ (উদাহরণস্বরূপ
রক্ষণশীল জিসি )।
আবর্জনা সংগ্রহকারীদের সন্ধান করা
এই জাতীয় ফুটো ছাড়াই জিসির আরও শক্তিশালী পরিবার হ'ল ট্রেসিং পরিবার যা মেমোরিটির লাইভ অংশগুলি সন্ধান করে যা ভালভাবে চিহ্নিত রুট পয়েন্টার থেকে শুরু করে। এই ট্রেসিং প্রক্রিয়ায় মেমরির সমস্ত অংশ যা পরিদর্শন করা হয় না (যা আসলে বিভিন্ন উপায়ে পচে যেতে পারে তবে আমাকে সহজ করতে হবে) মেমরির অব্যবহৃত অংশ যা এভাবে পুনরায় দাবি করা যেতে পারে 1 । এই সংগ্রাহকরা সমস্ত মেমরি অংশ পুনরায় দাবি জানাতে পারবেন যা প্রোগ্রামের দ্বারা আর অ্যাক্সেস করা যায় না, তা সে যাই হোক না কেন। এটি বিজ্ঞপ্তি কাঠামোর পুনরায় দাবি আদায় করে এবং আরও উন্নত জিসি এই দৃষ্টান্তের কিছু পরিবর্তনের উপর ভিত্তি করে তৈরি হয়, কখনও কখনও অত্যন্ত পরিশীলিত। এটি কয়েকটি ক্ষেত্রে রেফারেন্স গণনার সাথে মিলিত হতে পারে এবং এর দুর্বলতাগুলি পূরণ করে।
একটি সমস্যা হ'ল আপনার বিবৃতি (প্রশ্নের শেষে):
যে ভাষাগুলি স্বয়ংক্রিয় আবর্জনা সংগ্রহের প্রস্তাব দেয় তারা অবজেক্ট ধ্বংস / চূড়ান্তকরণ সমর্থন করার পক্ষে প্রধান প্রার্থী বলে মনে হয় কারণ যখন কোনও বস্তু আর ব্যবহারে থাকবে না তখন তারা 100% নিশ্চিততার সাথে জানে।
সংগ্রহকারীদের সন্ধানের জন্য প্রযুক্তিগতভাবে ভুল ।
১০০% নিশ্চিততার সাথে যা জানা যায় তা হ'ল মেমরির অংশগুলি আর ব্যবহারে নেই । (আরও স্পষ্টভাবে, এটি বলা উচিত যে এগুলি আর অ্যাক্সেসযোগ্য নয় , কারণ প্রোগ্রামের যুক্তি অনুসারে কিছু অংশ যা আর ব্যবহার করা যায় না, যদি প্রোগ্রামে তাদের কাছে এখনও অব্যর্থ পয়েন্টার থাকে তবে এখনও ব্যবহার হিসাবে বিবেচিত হয়) ডেটা।) তবে মেমরির এখন অব্যবহৃত অংশগুলিতে কোন অব্যবহৃত বস্তুগুলি সংরক্ষণ করা হতে পারে তা জানতে আরও প্রক্রিয়াজাতকরণ এবং উপযুক্ত কাঠামোগুলি প্রয়োজন । প্রোগ্রামটির পরিচিতি থেকে এটি নির্ধারণ করা যায় না, যেহেতু প্রোগ্রামটি আর মেমরির এই অংশগুলির সাথে সংযুক্ত থাকে না।
এইভাবে আবর্জনা সংগ্রহের পরে, আপনার কাছে মেমরির টুকরো রয়েছে যাতে অবজেক্টগুলি রয়েছে যা আর ব্যবহারযোগ্য নয়, তবে সঠিক চূড়ান্তকরণ প্রয়োগ করার জন্য এই বিষয়গুলি কী তা জানার কোনও অগ্রাধিকার নেই। তদ্ব্যতীত, ট্রেসিং সংগ্রাহক যদি মার্ক-ও-সুইপ প্রকারের হয় তবে এটি হতে পারে যে কিছু টুকরো টুকরো টুকরো থাকতে পারে যা ইতিমধ্যে পূর্ববর্তী জিসি পাসে চূড়ান্ত হয়ে গেছে, তবে খণ্ড খণ্ড কারণে এটি ব্যবহৃত হয়নি। তবে এটি প্রসারিত সুস্পষ্ট টাইপিং ব্যবহার করে ডিল করা যেতে পারে।
সরল সংগ্রাহক কেবল মেমোরির এই টুকরোগুলিকে পুনরায় দাবি করতে পারবেন, এমন কোনও পদক্ষেপ ছাড়াই, চূড়ান্তকরণের জন্য সেই অব্যবহৃত মেমরিটি অন্বেষণ করতে, সেখানে থাকা অবজেক্টগুলি চিহ্নিত করতে এবং চূড়ান্তকরণ পদ্ধতি প্রয়োগ করতে একটি নির্দিষ্ট পাসের প্রয়োজন হয়। তবে এই ধরনের অন্বেষণের জন্য সেখানে সংরক্ষণ করা ধরণের পদার্থগুলির নির্ধারণের প্রয়োজন হয় এবং যথাযথ চূড়ান্তকরণ প্রয়োগের জন্য প্রকারের সংকল্পও প্রয়োজন হয়, যদি থাকে তবে।
সুতরাং এটি বিভিন্ন প্রযুক্তির মাধ্যমে সেই পাসের সময় যথাযথ ধরণের তথ্য উপলভ্য করতে জিসি সময় (অতিরিক্ত পাস) এবং সম্ভবত অতিরিক্ত মেমরির ব্যয়কে অতিরিক্ত খরচ বোঝায়। এই ব্যয়গুলি তাত্পর্যপূর্ণ হতে পারে কারণ কেউ প্রায়শই কয়েকটি কয়েকটি বিষয় চূড়ান্ত করতে চায়, যখন সময় এবং স্পেসের ওভারহেড সমস্ত বস্তুকে উদ্বেগ করতে পারে।
আরেকটি বিষয় হ'ল সময় এবং স্পেসের ওভারহেড কেবলমাত্র জিসি এক্সিকিউশন নয়, প্রোগ্রাম কোড প্রয়োগের বিষয়ে উদ্বেগ প্রকাশ করতে পারে।
নির্দিষ্ট সমস্যাগুলিতে ইঙ্গিত করে আমি আরও সঠিক উত্তর দিতে পারি না, কারণ আপনার তালিকৃত অনেক ভাষার স্পেসিফিকেশন আমি জানি না। সি এর ক্ষেত্রে, টাইপিং একটি খুব কঠিন সমস্যা যা রক্ষণশীল সংগ্রাহকদের বিকাশের দিকে নিয়ে যায়। আমার ধারণাটি এটি সি ++ কেও প্রভাবিত করে তবে আমি সি ++ তে কোনও বিশেষজ্ঞ নই। এটি কনফারভেটিভ জিসি নিয়ে গবেষণা বেশিরভাগ গবেষক হ্যান্স বোহম দ্বারা নিশ্চিত করা হয়েছে বলে মনে হয় । কনজারভেটিভ জিসি পদ্ধতিতে সমস্ত অব্যবহৃত মেমোরিটি সঠিকভাবে পুনরায় দাবি করতে পারবেন না কারণ এতে ডেটাতে সুনির্দিষ্ট ধরণের তথ্যের অভাব থাকতে পারে। একই কারণে, এটি পদ্ধতিগতভাবে চূড়ান্তকরণ পদ্ধতিগুলি প্রয়োগ করতে সক্ষম হবে না।
সুতরাং, আপনি কিছু ভাষা থেকে যেমন জানেন, আপনি যা জিজ্ঞাসা করছেন তা করা সম্ভব। তবে তা নিখরচায় আসে না। ভাষা এবং এর প্রয়োগের উপর নির্ভর করে আপনি যখন বৈশিষ্ট্যটি ব্যবহার না করেন তখনও এটিতে ব্যয় হতে পারে। এই সমস্যাগুলি সমাধান করার জন্য বিভিন্ন কৌশল এবং বাণিজ্য-অফগুলি বিবেচনা করা যেতে পারে, তবে এটি যুক্তিযুক্ত আকারের উত্তরের বাইরে beyond
1 - এটি ট্রেসিং সংগ্রহের একটি বিমূর্ত উপস্থাপনা (উভয় অনুলিপি এবং চিহ্ন-এবং-স্যুইপ জিসি সমন্বিত), ট্রেসিং সংগ্রাহকের ধরণ অনুসারে জিনিসগুলি পৃথক হয় এবং মেমরির অব্যবহৃত অংশ অন্বেষণ করা আলাদা হয়, অনুলিপি বা চিহ্ন এবং উপর নির্ভর করে সুইপ ব্যবহার করা হয়।
finalize
/destroy
একটি মিথ্যা? এটি কার্যকর করা হবে এমন কোন গ্যারান্টি নেই। এবং, এমনকি যদি আপনি জানেন না কখন (স্বয়ংক্রিয় আবর্জনা সংগ্রহের দেওয়া হয়েছে), এবং প্রয়োজনীয় প্রসঙ্গে থাকলেও (এটি ইতিমধ্যে সংগ্রহ করা হতে পারে)। সুতরাং অন্যান্য উপায়ে সামঞ্জস্যপূর্ণ অবস্থা নিশ্চিত করা নিরাপদ এবং কেউ প্রোগ্রামারকে এটি করতে বাধ্য করতে পারে।