2012-02-26 15 views
8

मैं जानना चाहता हूं कि विनाशक और कचरा कलेक्टर के बीच कोई अंतर है, विनाशक का उपयोग आवेदन के जीवनकाल के अंत में सभी अप्रयुक्त वस्तुओं का निपटान करने के लिए किया जाता है, वही कचरा कलेक्टर का उपयोग होता है , कचरा कलेक्टर मैन्युअल बुलाया जा सकता है या आवेदन के अंत में किया, नाशक के साथ एक ही है, दोनों वैकल्पिक हैं और unreferenced वस्तु निपटान के लिए उपयोग करते हैं, किसी को भी मुझे इंगित कर सकते हैं क्या सटीक अंतरविनाशक और कचरा कलेक्टर के बीच अंतर

+1

नेट (अधिकांश कचरा एकत्रित भाषाओं की तरह) में विनाशक नहीं होते हैं। सी ++/सीएलआई में वे फाइनलाइजर्स का उपयोग करके फिक्र हो जाते हैं। –

+1

@ बिली सी # भाषा स्पेक ने "फाइनेंजर" और "विनाशक" दोनों शब्दों का उपयोग एक ही बात का जिक्र किया है। –

+0

@MarcGravell: यह अजीब है; वे वास्तव में पूरी तरह से अलग अर्थशास्त्र है। एक अवधारणा निश्चित रूप से चलती है; दूसरा नहीं है। मैं सी # स्तर की तुलना में सीएलआर स्तर पर और सोच रहा हूं; सभी प्रश्नों के बाद। सी # के बजाय नेट, और जहां तक ​​सीएलआर का संबंध है, विनाशक मौजूद नहीं हैं। –

उत्तर

6

नाशक एक विशेष है सदस्य फ़ंक्शन जिसे ऑब्जेक्ट नष्ट होने पर बुलाया जाता है। यह कक्षा द्वारा संचालित अंतिम विधि है।

कचरा कलेक्टर ढांचे का हिस्सा है, स्वचालित रूप से स्मृति का प्रबंधन करता है, और स्मृति-रिसाव से बचने के लिए गैर-निर्धारक रूप से अनियंत्रित वस्तुओं को एकत्रित करता है।

+0

जीसी डिस्कवर के दौरान विनाशक द्वारा उत्पन्न 'अंतिमकरण' विधि लागू की जाती है एक वस्तु है कि, लेकिन इस तथ्य के लिए कि ऑब्जेक्ट को अंतिम रूप देने के लिए पंजीकृत किया गया था, अब मौजूद नहीं होगा। यह प्रायः क्लास ऑब्जेक्ट पर चलने वाली आखिरी विधि होती है, लेकिन यह संभव है कि ऑब्जेक्ट के लिए एक मजबूत मजबूत संदर्भ फ़ाइनलाइज़र पूरा होने से पहले किसी भी समय बनाया जा सके और संग्रहीत हो सके (और संभवतः इससे पहले भी शुरू हो जाए!) जिस स्थिति में ऑब्जेक्ट हो सकता है अनिश्चित काल तक अस्तित्व में रहना जारी रखें। – supercat

3

कचरा कलेक्टर .NET पर्यावरण का एक हिस्सा है जो वस्तुओं का ट्रैक रखता है और यह सुनिश्चित करता है कि ऑब्जेक्ट को स्मृति से हटा दिया जाता है जब उन्हें अब आवश्यकता नहीं होती है।

एक विनाशक एक वर्ग डिजाइन का हिस्सा है। यह एक निर्माता के विपरीत है। जब आप इसे घोषित करते हैं तो जीसी इसे किसी ऑब्जेक्ट को नष्ट करते समय कॉल करेगा।

Here is the MSDN documentation.

6

कचरा कलेक्टर और finalizer/नाशक आंतरिक रूप से जुड़े हुए हैं - हालांकि, अधिकांश वस्तुओं की जरूरत नहीं है (और की जरूरत नहीं है) एक नाशक। वे वास्तव में प्रबंधित कोड में बहुत दुर्लभ हैं, और आमतौर पर अप्रबंधित संसाधनों को जारी करने के लिए उपयोग किया जाता है। यदि किसी ऑब्जेक्ट में विनाशक/फाइनेंजर होता है, तो कचरा कलेक्टर इसे संग्रह के रूप में उसी समय के आसपास आमंत्रित करता है (शायद अगले पास में)। कचरा संग्रह गैर-निर्धारक है - ऐसा होता है जब ऐसा होता है - अक्सर स्मृति दबाव से संबंधित होता है।

हालांकि, अधिक आम बात यह है कि IDISposable है। यह संसाधनों को जारी करने के लिए अब एक अनुमानित पैटर्न की अनुमति देता है (जीसी अगली बार होने पर)। प्रायः, जिन कक्षाओं में फाइनलाइज़र होता है, वे भी डिस्पोजेक्टर को अक्षम करने के लिए निपटान() कार्यान्वयन के साथ IDISposable हो सकते हैं (यदि हम पहले ही साफ़ कर चुके हैं तो इसकी आवश्यकता नहीं है)। ध्यान दें कि निपटान() कचरा संग्रह से असंबंधित है, लेकिन "उपयोग" कथन के माध्यम से भाषा समर्थन है।

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

+0

ठीक है, मुझे यह जांचने दें कि मुझे अवधारणा मिली है, जीसी का उपयोग यह जांचने के लिए किया जाता है कि वस्तु का कोई निपटान आवश्यक है या नहीं, और यदि कोई इसे विनाशक कहलाता है, तो जीसी अपने आप पर कुछ भी नष्ट नहीं कर सकता है, और दूसरी ओर Desctructor , वर्ग के अंत में वस्तु को नष्ट कर देगा, और विनाशक स्मृति समस्याओं की जांच नहीं कर सकता है, यह अंत में सबकुछ नष्ट कर देता है। क्या मैं सही हू? – Abbas

+0

@Abbas एकाधिक "काफी नहीं" मुझे डर है। सबसे पहले, "निपटान" शब्द से बचें - जीसी कभी भी 'आईडीस्पोजेबल' के मामले में "निपटान" नहीं करती है, इसलिए यह उस शब्द से दूर रहने के लायक है। अभी व; जीसी प्रबंधित ढेर पर स्मृति को पुनः प्राप्त करने के लिए ज़िम्मेदार है कि प्रत्येक ऑब्जेक्ट का उपयोग किया जाता है, प्रत्येक ऑब्जेक्ट अब पहुंचने योग्य नहीं होता है। यह बहुत कुछ नष्ट कर सकता है। हालांकि, ** यदि ** एक विनाशक/अंतिमकर्ता है (और इस वस्तु के लिए स्पष्ट रूप से अक्षम नहीं किया गया है), तो जीसी किसी भी अप्रबंधित संसाधनों को साफ करने का मौका देने के लिए विनाशक/अंतिमकर्ता का आह्वान करेगा। –

+0

आपने कहा "यह बहुत कुछ नष्ट कर सकता है", और विनाशक अंत में सबकुछ नष्ट कर सकता है, उस स्थिति में दोनों के बीच क्या अंतर है, हालांकि एमएसडीएन कहता है, "जब वस्तु विनाश के योग्य होती है, तो कचरा कलेक्टर चलता है ऑब्जेक्ट की विधि को अंतिम रूप दें। ", इसका मतलब है कि जीसी मेमोरी को मुक्त नहीं कर सकता है, इसे स्मृति को मुक्त करने के लिए विनाशक को फोन करना है: यहां लिंक http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx। – Abbas

0

कचरा कलेक्टर मुख्य रूप से उन सभी वस्तुओं की प्रतिलिपि बनाकर काम करता है जो इसे रैम के एक नए हिस्से में पा सकते हैं, और फिर पुराने क्षेत्र को खाली कर सकते हैं; यह न तो जानता है और न ही परवाह करता है कि पांच या 500,000 वस्तुओं को पीछे छोड़ दिया गया था या नहीं। ध्यान दें कि लाइव मजबूत संदर्भों द्वारा संदर्भित सभी वस्तुओं को खोजने के अलावा, कचरा कलेक्टर कुछ अन्य वस्तुओं को भी ढूंढ सकता है, जिसमें Finalize ओवरराइड, मॉनिटर लॉक के रूप में उपयोग की जाने वाली ऑब्जेक्ट्स, वीक रेफरेंस ऑब्जेक्ट्स द्वारा लक्षित ऑब्जेक्ट आदि शामिल हैं। कक्षा से पुराना क्षेत्र, कचरा कलेक्टर को किसी भी 'विशेष' वस्तुओं से निपटना चाहिए जो इसके बारे में जानता है जो अभी भी वहां बैठा हो सकता है।

अन्य चीजों के अलावा, कचरा कलेक्टर की सभी वस्तुओं की एक सूची है जो अंतिम रूप से पंजीकृत हैं; यह उस सूची में सभी ऑब्जेक्ट्स को यह देखने के लिए जांच करेगा कि क्या उन्हें अभी तक नए मेमोरी क्षेत्र में कॉपी किया गया है या नहीं।यदि कोई ऐसा पाया गया है जो नहीं किया गया है, तो उन्हें पंजीकृत फाइनेंजर वाले ऑब्जेक्ट्स की सूची से हटा दिया जाएगा और ऑब्जेक्ट्स की एक सूची में जोड़ा जाएगा जिनके Finalize विधि को व्यावहारिक रूप से चलाना चाहिए। एक बार यह पंजीकृत फाइनेंजर के साथ सभी ऑब्जेक्ट्स के लिए किया गया है, ऑब्जेक्ट्स की सूची पर किसी भी ऑब्जेक्ट को तत्काल अंतिम रूप देने की आवश्यकता होती है, साथ ही साथ किसी भी ऑब्जेक्ट को जिनके ऑब्जेक्ट्स में संदर्भ होता है, को नए क्षेत्र में कॉपी किया जाएगा।

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