Object resurrection
कचरा संग्रह के साथ ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं में, ऑब्जेक्ट पुनरुत्थान तब होता है जब ऑब्जेक्ट विनाश की प्रक्रिया के दौरान कोई वस्तु जीवन में वापस आती है, एक फाइनलाइज़र के निष्पादित होने के दुष्प्रभाव के रूप में। वस्तु पुनरुत्थान कई समस्याओं का कारण बनता है, विशेष रूप से वस्तु पुनरुत्थान की संभावना-भले ही ऐसा न हो-कचरा संग्रह को काफी अधिक जटिल और धीमा बनाती है, और यह एक प्रमुख कारण है कि अंतिम रूप देने वालों को हतोत्साहित किया जाता है। भाषाएँ विभिन्न तरीकों से वस्तु पुनरुत्थान से संबंधित हैं। दुर्लभ परिस्थितियों में, ऑब्जेक्ट पुनरुत्थान का उपयोग कुछ डिज़ाइन पैटर्न को लागू करने के लिए किया जाता है, विशेष रूप से एक ऑब्जेक्ट पूल, जबकि अन्य परिस्थितियों में पुनरुत्थान अंतिम रूप देने में त्रुटि के कारण एक अवांछित बग है, और सामान्य रूप से पुनरुत्थान को हतोत्साहित किया जाता है। प्रक्रिया वस्तु पुनरुत्थान निम्नलिखित प्रक्रिया के माध्यम से होता है। सबसे पहले, एक वस्तु कचरा बन जाती है जब यह कार्यक्रम से पहुँचने योग्य नहीं होती है, और इसे एकत्र किया जा सकता है (नष्ट और विच्छेदित)। फिर, वस्तु विनाश के दौरान, कचरा संग्राहक द्वारा वस्तु को आवंटित करने से पहले, एक अंतिम विधि चलाई जा सकती है, जो बदले में उस वस्तु या किसी अन्य कचरा वस्तु (अंतिम वस्तु के साथ वस्तु से पहुँच योग्य) को संदर्भ बनाकर फिर से पहुँच योग्य बना सकती है, क्योंकि अंतिम रूप देने वाले में मनमाना कोड हो सकता है। यदि ऐसा होता है, तो संदर्भित वस्तु-जो आवश्यक रूप से अंतिम वस्तु नहीं है-अब कचरा नहीं है, और इसे अलग नहीं किया जा सकता है, क्योंकि अन्यथा इसके संदर्भ लटकते हुए संदर्भ बन जाएंगे और उपयोग करने पर त्रुटियों का कारण बनेंगे, आम तौर पर प्रोग्राम क्रैश या अप्रत्याशित व्यवहार। इसके बजाय, स्मृति सुरक्षा बनाए रखने के लिए, वस्तु को जीवन में वापस लाया जाता है या पुनर्जीवित किया जाता है। इसका पता लगाने के लिए, एक कचरा संग्राहक आम तौर पर अंतिम रूप देने वालों की उपस्थिति में दो चरणों में संग्रह करेगाः पहले किसी भी कचरे को अंतिम रूप दें जिसमें अंतिम रूप देने वाला हो, और फिर सभी कचरे (या अंतिम रूप देने वाली वस्तुओं से पहुँचने योग्य सभी कचरे) की फिर से जांच करें, अगर अंतिम रूप देने वालों ने कुछ कचरे को फिर से इकट्ठा किया है। यह ओवरहेड जोड़ता है और स्मृति सुधार में देरी करता है। पुनरुत्थित वस्तुएँ एक पुनरुत्थित वस्तु को अन्य वस्तुओं के समान माना जा सकता है, या विशेष रूप से माना जा सकता है। कई भाषाओं में, विशेष रूप से सी #, जावा और पायथन (पायथन 3.4 से), वस्तुओं को केवल एक बार अंतिम रूप दिया जाता है, ताकि किसी वस्तु के बार-बार पुनर्जीवित होने या यहां तक कि अविनाशी होने की संभावना से बचा जा सके; सी #में डिफ़ॉल्ट रूप से अंतिम रूप देने वाली वस्तुओं को केवल एक बार अंतिम रूप दिया जाता है, लेकिन अंतिम रूप देने के लिए फिर से पंजीकृत किया जा सकता है। अन्य मामलों में पुनर्जीवित वस्तुओं को त्रुटियां माना जाता है, विशेष रूप से उद्देश्य-सी में; या अन्य वस्तुओं के लिए समान रूप से व्यवहार किया जाता है, विशेष रूप से पायथन 3.4 से पहले। एक पुनर्जीवित वस्तु को कभी-कभी ए या ज़ोंबी कहा जाता है, लेकिन इस शब्द का उपयोग भाषा और लेखक के आधार पर उपयोग के साथ वस्तु विनाश से संबंधित विभिन्न वस्तु अवस्थाओं के लिए किया जाता है। एक "ज़ोंबी ऑब्जेक्ट" का उद्देश्य-सी में एक विशेष अर्थ है, जो नीचे विस्तृत है। ज़ोंबी ऑब्जेक्ट ज़ोंबी प्रक्रियाओं के लिए कुछ हद तक समान हैं, जिसमें वे एक समाप्ति स्थिति परिवर्तन से गुजर चुके हैं और डीलोकेशन के करीब हैं, लेकिन विवरण काफी अलग हैं। . NET फ्रेमवर्क में परिवर्तन, विशेष रूप से C #और VB.NET, "ऑब्जेक्ट पुनरुत्थान" इसके बजाय अंतिम रूप देने के दौरान एक वस्तु की स्थिति को संदर्भित करता हैः वस्तु को जीवन में वापस लाया जाता है (दुर्गम होने से), अंतिम रूप देने वाले को चलाया जाता है, और फिर दुर्गम होने पर वापस आ जाता है (और अब भविष्य में अंतिम रूप देने के लिए पंजीकृत नहीं है)। . NET में, जिन वस्तुओं को अंतिम रूप देने की आवश्यकता होती है, उन्हें वस्तु-दर-वस्तु ट्रैक नहीं किया जाता है, बल्कि इसके बजाय एक अंतिम "कतार" में संग्रहीत किया जाता है, इसलिए इस लेख के अर्थ में पुनर्जीवित वस्तुओं की धारणा के बजाय, कोई "अंतिम रूप देने के लिए कतार में खड़ी" वस्तुओं की बात करता है। इसके अलावा, वस्तुओं को अंतिम रूप देने के लिए GC.ReRegisterForFinalize के माध्यम से पुनः इंक्यू किया जा सकता है, इस बात का ध्यान रखते हुए कि वस्तुओं को इंक्यू से गुणा न किया जाए। तंत्र दो मुख्य तरीके हैं जिनसे एक वस्तु अपने आप को या किसी अन्य वस्तु को पुनर्जीवित कर सकती हैः एक ऐसी वस्तु में अपने लिए एक संदर्भ बनाकर जिस तक वह पहुंच सके (कचरा पहुँचने योग्य नहीं है, लेकिन कचरा गैर-कचरा वस्तुओं को संदर्भित कर सकता है), या पर्यावरण में एक संदर्भ बनाकर (वैश्विक चर, या कुछ मामलों में एक समापन में स्थिर चर या चर)। दोनों के पायथन उदाहरण एक वस्तु के लिए अनुसरण करते हैं जो खुद को पुनर्जीवित करती है। एक वस्तु के लिए अन्य वस्तुओं को पुनर्जीवित करना भी संभव है यदि दोनों को एक ही तंत्र द्वारा दिए गए कचरा संग्रह चक्र में एकत्र किया जा रहा है। एक वस्तु में एक संदर्भ बनाकर खुद को पुनर्जीवित करता है जिस तक वह पहुंच सकता हैः वर्ग क्लिंगीः डेफ _ _ init _ (सेल्फ, रेफ = कोई नहीं)-> कोई नहींः self.ref = रेफ डेफ _ _ डेल _ (सेल्फ): यदि self.ref: self.ref. रेफ = सेल्फ प्रिंट ("मुझे मत छोड़ो!") a = Clingy (Clingy ()) #एक 2-तत्व से जुड़ी सूची बनाएँ, #जिसे |a। a.ref द्वारा संदर्भित किया गया है। रेफ़ = a #एक चक्र बनाएँ a.ref = कोई नहीं #पहले नोड से दूसरे तक के संदर्भ को साफ़ करने से दूसरा कचरा a.ref = कोई नहीं वैश्विक वातावरण में एक संदर्भ बनाकर खुद को ठीक करता हैः c = कोई नहीं वर्ग अमरः डेफ़ _ _ डेल _ (स्वयं): वैश्विक cc = स्व-मुद्रण ("मैं अभी तक मृत नहीं हूँ।") c = अमर () c = कोई नहीं #क्लियरिंग |c। वस्तु को कचरा c = कोई नहीं बनाता है उपरोक्त उदाहरणों में, CPython में 3.4 से पहले, ये बार-बार अंतिम रूप देंगे, और वस्तुओं को कचरा-संग्रहित नहीं किया जाएगा, जबकि CPython 3.4 और बाद में, अंतिम रूप देने वालों को केवल एक बार बुलाया जाएगा, और दूसरी बार पहुँच से बाहर होने पर वस्तुओं को कचरा-संग्रहित किया जाएगा। समस्याएँ वस्तु पुनरुत्थान बड़ी संख्या में समस्याओं का कारण बनता है। कचरा संग्रह को जटिल बनाता है वस्तु पुनरुत्थान की संभावना का मतलब है कि कचरा संग्राहक को अंतिम रूप देने के बाद पुनर्जीवित वस्तुओं की जांच करनी चाहिए-भले ही यह वास्तव में न हो-जो कचरा संग्रह को जटिल और धीमा कर देता है। अविनाशी वस्तुएँ कुछ परिस्थितियों में एक वस्तु अविनाशी हो सकती हैः यदि किसी वस्तु को अपने अंतिम रूप में पुनर्जीवित किया जाता है (या वस्तुओं का एक समूह अपने अंतिम रूप के परिणामस्वरूप एक दूसरे को पुनर्जीवित करता है), और अंतिम रूप देने वाले को हमेशा वस्तु को नष्ट करते समय बुलाया जाता है, तो वस्तु को नष्ट नहीं किया जा सकता है और इसकी स्मृति को पुनः प्राप्त नहीं किया जा सकता है। आकस्मिक पुनरुत्थान और रिसाव तीसरा, वस्तु पुनरुत्थान अनजाने में हो सकता है, और परिणामी वस्तु शब्दार्थ कचरा हो सकती है, इसलिए वास्तव में कभी एकत्र नहीं की जाती है, जिससे तार्किक स्मृति रिसाव होता है। असंगत स्थिति और पुनर्प्रारंभीकरण एक पुनर्जीवित वस्तु असंगत स्थिति में हो सकती है, या वर्ग अपरिवर्तकों का उल्लंघन कर सकती है, क्योंकि अंतिम रूप देने वाले को निष्पादित किया गया है और एक अनियमित स्थिति पैदा हो रही है। इस प्रकार पुनर्जीवित वस्तुओं को आम तौर पर हाथ से फिर से शुरू करने की आवश्यकता होती है। विशिष्ट अंतिम रूप देना या पुनः अंतिम रूप देना कुछ भाषाओं में (जैसे जावा और पायथन 3.4 +) अंतिम रूप देना प्रति वस्तु ठीक एक बार होने की गारंटी है, इसलिए पुनर्जीवित वस्तुओं को उनके अंतिम रूप देने वाले नहीं होंगे; इसलिए, पुनर्जीवित वस्तुओं को अंतिम रूप देने वाले के बाहर किसी भी आवश्यक सफाई कोड को निष्पादित करना होगा। कुछ अन्य भाषाओं में, प्रोग्रामर बार-बार अंतिम रूप देने के लिए मजबूर कर सकता है; विशेष रूप से, सी #में GC.ReRegisterForFinalize है। समाधान भाषाओं ने वस्तु पुनरुत्थान से निपटने के लिए कई अलग-अलग तरीके अपनाए हैं, आमतौर पर अंतिम रूप देने वालों की उपस्थिति में दो-चरणीय कचरा संग्रह करके, लटकते संदर्भों को रोकने के लिए; और केवल एक बार वस्तुओं को अंतिम रूप देकर, विशेष रूप से वस्तुओं को अंतिम रूप दिए जाने के रूप में चिह्नित करके (एक झंडे के माध्यम से), यह सुनिश्चित करने के लिए कि वस्तुओं को नष्ट किया जा सकता है। जावा वस्तु को तब तक मुक्त नहीं करेगा जब तक कि यह साबित नहीं हो जाता है कि वस्तु एक बार फिर पहुँच से बाहर है, लेकिन अंतिम रूप देने वाले को एक से अधिक बार नहीं चलाएगा। पायथन में, पायथन 3.4 से पहले, मानक सीपीयथन कार्यान्वयन पुनर्जीवित वस्तुओं को अन्य वस्तुओं (जिन्हें कभी अंतिम रूप नहीं दिया गया था) के समान व्यवहार करेगा, जिससे अविनाशी वस्तुओं को संभव बनाया जा सकेगा। इसके अलावा, यह उन चक्रों को कचरा संग्रहित नहीं करेगा जिनमें अंतिम रूप देने वाली वस्तु के साथ एक वस्तु होती है, ताकि वस्तु पुनरुत्थान के साथ संभावित समस्याओं से बचा जा सके। पायथन 3.4 में शुरू करते हुए, व्यवहार काफी हद तक जावा के समान हैः वस्तुओं को केवल एक बार अंतिम रूप दिया जाता है ("पहले से ही अंतिम रूप" के रूप में चिह्नित किया जा रहा है), चक्रों का कचरा संग्रह दो चरणों में होता है, जिसमें दूसरे चरण में पुनर्जीवित वस्तुओं की जांच की जाती है। उद्देश्य-सी 2 पुनर्जीवित वस्तुओं को "ज़ोंबी" अवस्था में डाल देगा, जहाँ वे उन्हें भेजे गए सभी संदेशों को लॉग करते हैं, लेकिन कुछ और नहीं करते हैं। स्वचालित संदर्भ गणनाः कमजोर संदर्भों को संभालने के लिए कमजोर संदर्भों को शून्य करना भी देखें। . NET फ्रेमवर्क में, विशेष रूप से C #और VB.NET, ऑब्जेक्ट को अंतिम रूप देने का निर्धारण एक अंतिम "कतार" द्वारा किया जाता है, जिसे ऑब्जेक्ट विनाश के दौरान जांचा जाता है। एक फाइनलाइज़र के साथ वस्तुओं को निर्माण पर इस कतार में रखा जाता है, और जब फाइनलाइज़र को बुलाया जाता है तो डीक्यू किया जाता है, लेकिन इसे मैन्युअल रूप से (अंतिम रूप देने से पहले) सप्रेस फ़ाइनलाइज़ के साथ डीक्यू किया जा सकता है या री-रजिस्टर फ़ॉर फ़ाइनलाइज़ के साथ फिर से डीक्यू किया जा सकता है। इस प्रकार डिफ़ॉल्ट रूप से अंतिम रूप देने वाली वस्तुओं को अधिक से अधिक एक बार अंतिम रूप दिया जाता है, लेकिन इस अंतिम रूप को दबाया जा सकता है, या वस्तुओं को कई बार अंतिम रूप दिया जा सकता है यदि उन्हें पुनर्जीवित किया जाता है (फिर से सुलभ बनाया जाता है) और फिर अंतिम रूप देने के लिए फिर से तैयार किया जाता है। इसके अलावा, डिफ़ॉल्ट रूप से कमजोर संदर्भ पुनरुत्थान को ट्रैक नहीं करते हैं, जिसका अर्थ है कि यदि किसी वस्तु को पुनर्जीवित किया जाता है तो एक कमजोर संदर्भ को अपडेट नहीं किया जाता है; इन्हें छोटे कमजोर संदर्भ कहा जाता है, और कमजोर संदर्भ जो पुनरुत्थान को ट्रैक करते हैं उन्हें लंबे कमजोर संदर्भ कहा जाता है। अनुप्रयोग ऑब्जेक्ट पुनरुत्थान सामान्य रूप से उपयोग की जाने वाली वस्तुओं के ऑब्जेक्ट पूल को संभालने के लिए उपयोगी है, लेकिन यह कोड को अस्पष्ट करता है और इसे और अधिक भ्रमित करता है। इसका उपयोग केवल उन वस्तुओं के लिए किया जाना चाहिए जिनका अक्सर उपयोग किया जा सकता है और जहां इसके निर्माण/विनाश में समय लगता है। एक उदाहरण यादृच्छिक संख्याओं की एक सरणी हो सकती है, जहां उनमें से एक बड़ी संख्या कम समय में बनाई और नष्ट हो जाती है, लेकिन जहां वास्तव में एक ही समय में केवल एक छोटी संख्या उपयोग में है। वस्तु पुनरुत्थान के साथ, एक पूलिंग तकनीक निर्माण और विनाश के अनावश्यक ओवरहेड को कम कर देगी। यहाँ, एक पूल प्रबंधक वस्तु के संदर्भ के रूप में अपनी वस्तु ढेर जानकारी प्राप्त करेगा, यदि इसे वर्तमान में नष्ट किया जाना है। पूल प्रबंधक उस वस्तु को बाद में पुनः उपयोग के लिए रखेगा। ऑब्जेक्ट लाइफटाइम नोट्स संदर्भ स्मृति प्रबंधन ऑब्जेक्ट (कंप्यूटर विज्ञान) भी देखें।