2011-01-12 12 views
5

जबकि मुझे लगता है कि मैं समस्या का सारांश समझता हूं (यानी एक अच्छा जीसी ट्रैक ऑब्जेक्ट्स, स्कोप), मुझे इस विषय के बारे में दूसरों को मनाने के लिए पर्याप्त जानकारी नहीं है।आरएआईआई और कचरा संग्रह पारस्परिक रूप से अनन्य क्यों है?

क्या आप मुझे स्पष्टीकरण दे सकते हैं कि निर्धारक विनाशकों के साथ कोई कचरा-एकत्रित भाषा क्यों नहीं है?

+0

-1 प्रश्न गलत है। निर्धारक विनाशकों के साथ कचरा एकत्रित भाषाएं हैं, उदा। .NET पर 'IDISposable' सी #, वीबीएनईटी और एफ # के लिए निर्धारवादी विनाश प्रदान करता है। –

उत्तर

3

वे परस्पर अनन्य नहीं हैं। Libgc (Boehm-Reiser-Detlefs संग्राहक) के साथ C++ का उपयोग करने के लिए स्वतंत्र महसूस करें। आप अभी भी आरएआईआई, स्मार्ट पॉइंटर्स और मैन्युअल विलोपन का उपयोग कर सकते हैं, लेकिन जीसी चलने के साथ आप कुछ ऑब्जेक्ट्स को मिटाने के लिए "भूल" सकते हैं।

@ एंडी का जवाब बहुत देर से निपटने वाले संसाधनों के बारे में उत्तर महत्वपूर्ण बिंदु को याद करता है: यह संसाधनों को जारी करने में देरी नहीं है जो कि महत्वपूर्ण रूप से महत्वपूर्ण है, बल्कि रिलीज का आदेश है।

कारण जीसी अच्छी तरह से रिलीज ऑर्डर करने का कारण नहीं है कि यह आवश्यकताओं की आवश्यकताओं (निर्भरताओं) पर एक स्थलीय प्रकार की आवश्यकता होगी और यह एक महंगा एल्गोरिदम है।

फिर भी ओकंपल जीसी में एक दिलचस्प सुविधा है जहां आप किसी ऑब्जेक्ट को फाइनलज़र संलग्न कर सकते हैं। यदि ऑब्जेक्ट पहुंचने योग्य नहीं होता है तो फाइनलर चलाया जाता है, हालांकि ऑब्जेक्ट को हटाया नहीं जाता है (क्योंकि फाइनलर इसे फिर से पहुंच योग्य बना सकता है: उस स्थिति में आप एक और फाइनलर भी संलग्न कर सकते हैं)। ये फाइनलर ऑर्डर करने पर कुछ नियंत्रण प्रदान कर सकते हैं।

+0

रिलीज का आदेश महत्वपूर्ण हो सकता है। लेकिन रिलीज करने के लिए एक अनिर्धारित देरी, और रिलीज करने में संभावित पूर्ण विफलता भी महत्वपूर्ण हो सकती है। यह या तो नहीं है, या यह दोनों-और है। –

+0

रिलीज करने के लिए एक अनिर्धारित देरी वास्तव में महत्वपूर्ण हो सकती है, जिसमें स्मृति जारी करना शामिल है! प्रदर्शन मामलों लेकिन यह semantically प्रासंगिक नहीं है। हालांकि, रिलीज करने में पूरी विफलता मायने रखती है, लेकिन यह तब नहीं हो सकता है जब जीसी समाप्ति के बिंदु पर चलती है। यूनिक्स पर फ़ाइल हैंडल जैसे कुछ संसाधनों के लिए जीसी को समाप्ति पर नहीं चलाया जाता है क्योंकि ओएस किसी भी तरह संसाधनों को जारी करेगा। जीसी का उपयोग कर सामान्य सलाह महत्वपूर्ण संसाधनों के लिए आरएआईआई का उपयोग नहीं करती है, प्रोग्राम नियंत्रण के तहत रिलीज होती है। हालांकि यह स्पष्ट नहीं है कि इसका मतलब आलसी मूल्यांकन जैसे हास्केल में है। – Yttrill

0

Wikipedia से, यह देखते हुए कि अनुरेखण कचरा कलेक्टरों सबसे आम प्रकार हैं के बाद:

कचरा संग्रहण ट्रेसिंग नहीं नियतात्मक है। एक वस्तु जो कचरा संग्रह के लिए योग्य हो जाती है आमतौर पर अंततः साफ हो जाएगी, लेकिन कोई गारंटी नहीं है (या यहां तक ​​कि अगर) ऐसा होगा।

इसलिए, आरएआईआई पर भरोसा करने से संसाधन बहुत देर से निपटने का कारण बन सकता है।

परिणामस्वरूप, जावा के पास "अंतिमकर्ता से बचने" (जोशुआ ब्लोच द्वारा "प्रभावी जावा" में आइटम 6) के लिए दिशानिर्देश है। "फाइनल में कभी भी समय-महत्वपूर्ण नहीं किया जाना चाहिए।"

+0

एफडब्ल्यूआईडब्ल्यू कचरा संग्रह पर विकिपीडिया पेज अधिकतर गलत है, जिसमें सेक्शन शामिल है। –

+0

@ जोनह्रोप - इस उत्तर की किसी भी विशिष्ट आलोचना का स्वागत है। –

+0

यह स्पष्ट है कि एक साधारण जीसी एल्गोरिदम की क्रिया पूरी तरह से एक थ्रेडेड अनुप्रयोग में निर्धारक है। भविष्यवाणी करना मुश्किल हो सकता है या नहीं, लेकिन मेरे सिस्टम में कम से कम एक स्पष्ट संग्रह() कॉल है जो जीसी चलाता है और फाइनलर्स चलाएगा। निर्धारिती केवल बहु-थ्रेडेड अनुप्रयोगों में खो जाती है, जो किसी भी तरह से (सिस्टम और एप्लिकेशन के आधार पर) गैर-निर्धारिती को बाध्य या असंबद्ध कर सकती है, इसलिए यह स्पष्ट नहीं है कि उस मामले में भी जीसी चीजें पहले से कहीं ज्यादा खराब होती है। – Yttrill

0

कचरा कलेक्टर हर समय नहीं चल सकता है (refcounting करीब आता है, लेकिन आम तौर पर कचरा संग्रह के रूप में नहीं गिना जाता है), तो यह भी कोशिश नहीं करता है। यह सादा अव्यवहारिक है। इसलिए, किसी ऑब्जेक्ट के पहुंचने योग्य होने के बीच एक अनिवार्य देरी होती है (उदाहरण के लिए क्योंकि केवल संदर्भ ही दायरे से बाहर हो जाता है) और जीसी इसे इकट्ठा कर रहा है, संभवतः फाइनलर को फायर कर रहा है। यह देरी निर्धारिती नहीं है ... जब तक (और फिर, शब्द की सख्त भावना में निर्धारणात्मक विनाश संभव है, हालांकि अभी भी अव्यवहारिक) जीसी को एक निर्धारिक अनुसूची में मजबूर करता है - लेकिन यह "जीसी हर समय चल रहा है" , जो अभी भी अविश्वसनीय रूप से अव्यवहारिक है।

तो जीसी और निर्धारक सफाई पारस्परिक रूप से अनन्य हैं क्योंकि जीसी सभी सफाई करता है और यह निर्धारित नहीं हो सकता है, लेकिन इसकी दक्षता को अधिकतम करने पर भरोसा करना चाहिए।

संबंधित मुद्दे