Object resurrection
আবর্জনা সংগ্রহের সাথে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ভাষাগুলিতে, অবজেক্ট পুনরুত্থান হল যখন কোনও বস্তু ধ্বংসের প্রক্রিয়া চলাকালীন প্রাণ ফিরে আসে, একটি চূড়ান্তকারী কার্যকর হওয়ার পার্শ্ব প্রতিক্রিয়া হিসাবে। বস্তুর পুনরুত্থান বেশ কয়েকটি সমস্যা সৃষ্টি করে, বিশেষত বস্তুর পুনরুত্থানের সম্ভাবনা-এমনকি এটি না ঘটলেও-আবর্জনা সংগ্রহকে উল্লেখযোগ্যভাবে আরও জটিল এবং ধীর করে তোলে এবং এটি চূড়ান্তকারীদের নিরুৎসাহিত করার একটি প্রধান কারণ। ভাষাগুলি বিভিন্ন উপায়ে বস্তুর পুনরুত্থান নিয়ে আলোচনা করে। বিরল পরিস্থিতিতে, বস্তুর পুনরুত্থান নির্দিষ্ট নকশার নিদর্শনগুলি বাস্তবায়নের জন্য ব্যবহৃত হয়, বিশেষত একটি বস্তুর পুল, অন্য পরিস্থিতিতে পুনরুত্থান চূড়ান্তকরণের ত্রুটির কারণে সৃষ্ট একটি অযাচিত বাগ এবং সাধারণভাবে পুনরুত্থানকে নিরুৎসাহিত করা হয়। প্রক্রিয়া বস্তুর পুনরুত্থান নিম্নলিখিত প্রক্রিয়ার মাধ্যমে ঘটে। প্রথমত, কোনও বস্তু আবর্জনায় পরিণত হয় যখন এটি প্রোগ্রাম থেকে আর পৌঁছানো যায় না এবং সংগ্রহ করা যেতে পারে (ধ্বংস এবং বিচ্ছিন্ন)। তারপর, বস্তু ধ্বংসের সময়, আবর্জনা সংগ্রাহক বস্তুটির বরাদ্দ বাতিল করার আগে, একটি চূড়ান্তকরণ পদ্ধতি চালানো যেতে পারে, যা ফলস্বরূপ সেই বস্তু বা অন্য কোনও আবর্জনা বস্তুকে (চূড়ান্তকরণকারী দিয়ে বস্তু থেকে পৌঁছানো যায়) রেফারেন্স তৈরি করে আবার পৌঁছনো যায়, কারণ চূড়ান্তকরণে নির্বিচারে কোড থাকতে পারে। যদি এটি ঘটে, তবে উল্লিখিত বস্তুটি-যা অগত্যা চূড়ান্ত বস্তু নয়-আর আবর্জনা নয়, এবং এটি বিচ্ছিন্ন করা যাবে না, কারণ অন্যথায় এটির রেফারেন্সগুলি ঝুলন্ত রেফারেন্স হয়ে উঠবে এবং সাধারণত প্রোগ্রাম ক্র্যাশ বা অনির্দেশ্য আচরণ ব্যবহার করার সময় ত্রুটি সৃষ্টি করবে। পরিবর্তে, স্মৃতি নিরাপত্তা বজায় রাখার জন্য, বস্তুটি জীবনে ফিরে আসে বা পুনরুত্থিত হয়। এটি সনাক্ত করার জন্য, একজন আবর্জনা সংগ্রাহক সাধারণত চূড়ান্তকারীদের উপস্থিতিতে দুটি পর্যায়ে সংগ্রহ করবেনঃ প্রথমে চূড়ান্তকারী সহ যে কোনও আবর্জনা চূড়ান্ত করুন, এবং তারপরে সমস্ত আবর্জনা (বা চূড়ান্তকারী সহ বস্তু থেকে পৌঁছানো সমস্ত আবর্জনা) পুনরায় পরীক্ষা করুন, যদি চূড়ান্তকারীরা কিছু আবর্জনা পুনরুত্থিত করে থাকে। এটি ওভারহেড যোগ করে এবং মেমরি পুনরুদ্ধারে বিলম্ব করে। পুনরুত্থিত বস্তু একটি পুনরুত্থিত বস্তু অন্যান্য বস্তুর মতো একই আচরণ করা যেতে পারে, অথবা বিশেষভাবে চিকিত্সা করা যেতে পারে। অনেক ভাষায়, বিশেষত সি #, জাভা এবং পাইথন (পাইথন 3.4 থেকে), বস্তুগুলি শুধুমাত্র একবার চূড়ান্ত করা হয়, যাতে কোনও বস্তুর বারবার পুনরুত্থিত হওয়ার বা এমনকি অবিনাশী হওয়ার সম্ভাবনা এড়ানো যায়; সি #-এ ডিফল্টরূপে চূড়ান্তকারী বস্তুগুলি কেবল একবার চূড়ান্ত করা হয়, তবে চূড়ান্তকরণের জন্য পুনরায় নিবন্ধিত করা যেতে পারে। অন্যান্য ক্ষেত্রে পুনরুত্থিত বস্তুগুলিকে ত্রুটি হিসাবে বিবেচনা করা হয়, বিশেষত অবজেক্ট-সি-তে; বা অন্যান্য বস্তুর সাথে একইভাবে আচরণ করা হয়, বিশেষত পাইথনে পাইথন 3.4-এর আগে। একটি পুনরুত্থিত বস্তুকে কখনও কখনও এ বা জম্বি বলা হয়, তবে এই শব্দটি ভাষা এবং লেখকের উপর নির্ভর করে ব্যবহার সহ বস্তু ধ্বংস সম্পর্কিত বিভিন্ন বস্তুর অবস্থার জন্য ব্যবহৃত হয়। উদ্দেশ্য-সি-তে একটি "জম্বি অবজেক্ট"-এর একটি বিশেষ অর্থ রয়েছে, যা নীচে বিস্তারিতভাবে দেওয়া হয়েছে। জম্বি বস্তুগুলি জম্বি প্রক্রিয়াগুলির সাথে কিছুটা সাদৃশ্যপূর্ণ, কারণ তারা একটি সমাপ্তি অবস্থার পরিবর্তনের মধ্য দিয়ে গেছে এবং বিচ্ছিন্নকরণের কাছাকাছি, তবে বিবরণগুলি উল্লেখযোগ্যভাবে আলাদা। . নেট কাঠামোর বৈচিত্র্য, বিশেষত সি #এবং VB.NET, "বস্তু পুনরুত্থান" এর পরিবর্তে চূড়ান্তকরণের সময় একটি বস্তুর অবস্থাকে বোঝায়ঃ বস্তুটিকে জীবনে ফিরিয়ে আনা হয় (অ্যাক্সেসযোগ্য না হওয়া থেকে), চূড়ান্তকারীটি চালানো হয় এবং তারপরে অ্যাক্সেসযোগ্য না হয়ে ফিরে আসে (এবং ভবিষ্যতের চূড়ান্তকরণের জন্য আর নিবন্ধিত নয়)। . নেট-এ, কোন বস্তুগুলিকে চূড়ান্ত করার প্রয়োজন হয় তা অবজেক্ট-বাই-অবজেক্ট ট্র্যাক করা হয় না, বরং একটি চূড়ান্তকরণ "সারি"-তে সংরক্ষণ করা হয়, তাই এই নিবন্ধের অর্থে পুনরুত্থিত বস্তুর ধারণার পরিবর্তে, একজন "চূড়ান্তকরণের জন্য সারিবদ্ধ" বস্তুর কথা বলে। উপরন্তু, বস্তুকে চূড়ান্তকরণের জন্য GC.ReRegisterForFinalize-এর মাধ্যমে পুনরায় এনকিউ করা যেতে পারে, যাতে এনকিউ বস্তুগুলি গুণিত না হয়। প্রক্রিয়া দুটি প্রধান উপায় রয়েছে যার মাধ্যমে একটি বস্তু নিজেকে বা অন্য কোনও বস্তুকে পুনরুজ্জীবিত করতে পারেঃ এমন একটি বস্তুর মধ্যে নিজের একটি রেফারেন্স তৈরি করে যাতে এটি পৌঁছতে পারে (আবর্জনা পৌঁছনো যায় না, তবে আবর্জনা অ-আবর্জনা বস্তুর রেফারেন্স করতে পারে), অথবা পরিবেশে একটি রেফারেন্স তৈরি করে (গ্লোবাল ভেরিয়েবল, বা কিছু ক্ষেত্রে স্ট্যাটিক ভেরিয়েবল বা ক্লোজারে ভেরিয়েবল)। উভয়ের পাইথনের উদাহরণ অনুসরণ করা হয়, একটি বস্তুর জন্য যা নিজেকে পুনরুত্থিত করে। একটি বস্তুর পক্ষে অন্যান্য বস্তুকে পুনরুত্থিত করাও সম্ভব যদি উভয়ই একই পদ্ধতিতে প্রদত্ত আবর্জনা সংগ্রহের চক্রে সংগ্রহ করা হয়। একটি বস্তুর মধ্যে একটি রেফারেন্স তৈরি করে নিজেকে পুনরুজ্জীবিত করে যা এটি পৌঁছাতে পারেঃ শ্রেণী ক্লিঙ্গিঃ ডেফ _ _ ইনিট _ (স্ব, রেফ = কিছুই নয়)-> কিছুই নয়ঃ self.ref = রেফ ডেফ _ _ ডেল _ (স্ব): যদি self.ref: self.ref. রেফ = স্ব মুদ্রণ ("আমাকে ছেড়ে যাবেন না!") a = Clingy (Clingy ()) #একটি 2-উপাদান সংযুক্ত তালিকা তৈরি করুন, #|a। a.ref দ্বারা রেফারেন্স করা হয়েছে। উপরের উদাহরণগুলিতে, সিপিথনে 3.4-এর আগে, এগুলি বারবার চূড়ান্তকারী চালাবে এবং বস্তুগুলি আবর্জনা সংগ্রহ করা হবে না, সিপিথনে 3.4 এবং তার পরে, চূড়ান্তকারীগুলিকে কেবল একবার কল করা হবে, এবং বস্তুগুলি দ্বিতীয়বার পৌঁছানো যাবে না বলে আবর্জনা সংগ্রহ করা হবে। সমস্যা বস্তু পুনরুত্থান অনেক সমস্যা সৃষ্টি করে। আবর্জনা সংগ্রহকে জটিল করে তোলে বস্তুর পুনরুত্থানের সম্ভাবনার অর্থ হল আবর্জনা সংগ্রাহককে অবশ্যই চূড়ান্তকরণের পরে পুনরুত্থিত বস্তুর জন্য পরীক্ষা করতে হবে-এমনকি যদি এটি আসলে ঘটে না-যা আবর্জনা সংগ্রহকে জটিল করে তোলে এবং ধীর করে দেয়। কিছু পরিস্থিতিতে কোনও বস্তু অবিনাশী হতে পারেঃ যদি কোনও বস্তু তার নিজস্ব চূড়ান্তকরণে পুনরুত্থিত হয় (অথবা বস্তুর একটি গোষ্ঠী তাদের চূড়ান্তকরণের ফলে একে অপরকে পুনরুত্থিত করে), এবং বস্তুটিকে ধ্বংস করার সময় চূড়ান্তকারীকে সর্বদা ডাকা হয়, তবে বস্তুটিকে ধ্বংস করা যায় না এবং তার স্মৃতি পুনরুদ্ধার করা যায় না। দুর্ঘটনাজনিত পুনরুত্থান এবং ফুটো তৃতীয়ত, বস্তুর পুনরুত্থান অনিচ্ছাকৃত হতে পারে এবং ফলস্বরূপ বস্তুটি শব্দার্থিক আবর্জনা হতে পারে, তাই প্রকৃতপক্ষে কখনই সংগ্রহ করা হয় না, যার ফলে যৌক্তিক স্মৃতি ফুটো হয়। অসঙ্গতিপূর্ণ অবস্থা এবং পুনর্বিন্যাস একটি পুনরুত্থিত বস্তু একটি অসঙ্গতিপূর্ণ অবস্থায় থাকতে পারে, বা শ্রেণী অপরিবর্তনীয় লঙ্ঘন করতে পারে, কারণ চূড়ান্তকারীটি কার্যকর করা হয়েছে এবং একটি অনিয়মিত অবস্থা সৃষ্টি করেছে। সুতরাং পুনরুত্থিত বস্তুগুলি সাধারণত ম্যানুয়ালি পুনরায় চালু করা প্রয়োজন। কিছু ভাষায় (যেমন জাভা এবং পাইথন 3.4 +) চূড়ান্তকরণ প্রতি বস্তুতে ঠিক একবার হওয়ার নিশ্চয়তা দেওয়া হয়, তাই পুনরুত্থিত বস্তুগুলিকে তাদের চূড়ান্তকারী বলা হবে না; অতএব, পুনরুত্থিত বস্তুগুলিকে অবশ্যই চূড়ান্তকারীর বাইরে কোনও প্রয়োজনীয় ক্লিনআপ কোড কার্যকর করতে হবে। অন্যান্য কিছু ভাষায়, প্রোগ্রামার বারবার চূড়ান্তকরণ করতে বাধ্য করতে পারে; উল্লেখযোগ্যভাবে, সি #-এর GC.ReRegisterForFinalize রয়েছে। সমাধান ভাষাগুলি বস্তুর পুনরুত্থানের সাথে মোকাবিলা করার জন্য বিভিন্ন পদ্ধতি গ্রহণ করেছে, সাধারণত চূড়ান্তকরণকারীদের উপস্থিতিতে দ্বি-পর্যায়ের আবর্জনা সংগ্রহ করে, ঝুলন্ত রেফারেন্সগুলি রোধ করতে; এবং কেবলমাত্র একবার বস্তু চূড়ান্ত করে, বিশেষত বস্তুগুলিকে চূড়ান্ত হিসাবে চিহ্নিত করে (একটি পতাকার মাধ্যমে), যাতে নিশ্চিত করা যায় যে বস্তুগুলি ধ্বংস করা যেতে পারে। জাভা বস্তুটিকে মুক্ত করবে না যতক্ষণ না এটি প্রমাণ করে যে বস্তুটি আবার পৌঁছানো যায় না, তবে ফাইনালাইজারটি একাধিকবার চালাবে না। পাইথনে, পাইথন 3.4-এর আগে, স্ট্যান্ডার্ড সিপিথন বাস্তবায়ন পুনরুত্থিত বস্তুগুলিকে অন্যান্য বস্তুর (যা কখনও চূড়ান্ত করা হয়নি) সাথে একইভাবে আচরণ করবে, যা অবিনশ্বর বস্তুগুলিকে সম্ভব করে তুলবে। উপরন্তু, বস্তুর পুনরুত্থানের সাথে সম্ভাব্য সমস্যা এড়াতে এটি একটি চূড়ান্তকারী সহ একটি বস্তু ধারণ করে এমন চক্র সংগ্রহ করবে না। পাইথন 3.4 থেকে শুরু করে, আচরণ মূলত জাভার মতোইঃ বস্তুগুলি শুধুমাত্র একবার চূড়ান্ত করা হয় ("ইতিমধ্যে চূড়ান্ত" হিসাবে চিহ্নিত করা হয়েছে), চক্রের আবর্জনা সংগ্রহ দুটি পর্যায়ে হয়, দ্বিতীয় পর্যায়ে পুনরুত্থিত বস্তুর জন্য পরীক্ষা করা হয়। উদ্দেশ্য-সি 2 পুনরুত্থিত বস্তুগুলিকে একটি "জম্বি" অবস্থায় রাখবে, যেখানে তারা তাদের কাছে পাঠানো সমস্ত বার্তা লগ করবে, কিন্তু অন্য কিছু করবে না। আরও দেখুন স্বয়ংক্রিয় রেফারেন্স গণনাঃ দুর্বল রেফারেন্সগুলি পরিচালনা করার জন্য দুর্বল রেফারেন্সগুলি শূন্য করা। . NET কাঠামোতে, বিশেষত C #এবং VB.NET, বস্তু চূড়ান্তকরণ একটি চূড়ান্তকরণ "সারি" দ্বারা নির্ধারিত হয়, যা বস্তু ধ্বংসের সময় পরীক্ষা করা হয়। একটি চূড়ান্তকারী সহ বস্তুগুলি সৃষ্টির সময় এই সারিতে স্থাপন করা হয়, এবং চূড়ান্তকারীকে ডাকা হলে ডিকু করা হয়, তবে ম্যানুয়ালি ডিকু করা যেতে পারে (চূড়ান্তকরণের আগে) সাপ্রেস ফিনালাইজ দিয়ে বা রি-রেজিস্টার ফর ফিনালাইজ দিয়ে পুনরায় এনকু করা যেতে পারে। এইভাবে ডিফল্টভাবে চূড়ান্তকারী সহ বস্তুগুলি সর্বাধিক একবার চূড়ান্ত করা হয়, তবে এই চূড়ান্তকরণটি দমন করা যেতে পারে, বা বস্তুগুলি একাধিকবার চূড়ান্ত করা যেতে পারে যদি সেগুলি পুনরুত্থিত করা হয় (আবার অ্যাক্সেসযোগ্য করা হয়) এবং তারপরে চূড়ান্তকরণের জন্য পুনরায় সংযুক্ত করা হয়। উপরন্তু, ডিফল্টভাবে দুর্বল রেফারেন্সগুলি পুনরুত্থানকে ট্র্যাক করে না, যার অর্থ কোনও বস্তু পুনরুত্থিত হলে একটি দুর্বল রেফারেন্স আপডেট করা হয় না; এগুলিকে সংক্ষিপ্ত দুর্বল রেফারেন্স বলা হয় এবং পুনরুত্থানের ট্র্যাক করা দুর্বল রেফারেন্সগুলিকে দীর্ঘ দুর্বল রেফারেন্স বলা হয়। অ্যাপ্লিকেশন অবজেক্ট পুনরুত্থান সাধারণভাবে ব্যবহৃত বস্তুর একটি অবজেক্ট পুল পরিচালনা করতে কার্যকর, তবে এটি কোডকে অস্পষ্ট করে এবং এটিকে আরও বিভ্রান্তিকর করে তোলে। এটি শুধুমাত্র এমন বস্তুর জন্য ব্যবহার করা উচিত যা ঘন ঘন ব্যবহার করা যেতে পারে এবং যেখানে এটি নির্মাণ/ধ্বংস করতে সময় লাগে। একটি উদাহরণ এলোমেলো সংখ্যার একটি অ্যারে হতে পারে, যেখানে তাদের একটি বড় সংখ্যা অল্প সময়ের মধ্যে তৈরি এবং ধ্বংস করা হয়, কিন্তু যেখানে প্রকৃতপক্ষে একই সময়ে শুধুমাত্র একটি ছোট সংখ্যা ব্যবহার করা হয়। বস্তুর পুনরুত্থানের সাথে, একটি পুলিং কৌশল সৃষ্টি এবং ধ্বংসের অপ্রয়োজনীয় ওভারহেডকে হ্রাস করবে। এখানে, একটি পুল ম্যানেজার বস্তুটির একটি রেফারেন্স আকারে তার অবজেক্ট স্ট্যাক তথ্য পাবে, যদি এটি বর্তমানে ধ্বংস করা হয়। পুল ম্যানেজার পরে পুনরায় ব্যবহারের জন্য বস্তুটি রাখবেন। আরও দেখুন অবজেক্ট লাইফটাইম নোটস রেফারেন্স মেমোরি ম্যানেজমেন্ট অবজেক্ট (কম্পিউটার বিজ্ঞান)