2012-01-27 8 views
5

This लेख का कहना हैफाइनलाइजर्स के साथ कक्षाओं में एक से अधिक कचरा संग्रहण चक्र की आवश्यकता क्यों है?

एक वस्तु एक finalizer है, यह तुरंत नहीं हटाया जाता है जब कचरा कलेक्टर का फैसला करता है यह अब 'जी' है। इसके बजाए, यह बन जाता है जब तक कि .NET ने फाइनलाइज़र विधि नहीं कहा हो। इसका मतलब है कि इन ऑब्जेक्ट्स को आम तौर पर स्मृति से हटाए जाने के लिए एक से अधिक कचरा संग्रह की आवश्यकता होती है, क्योंकि वे पहले समय तक अप्रयुक्त होने के लिए जीवित रहेंगे।

मेरा सवाल यह है कि जीसी अंतिमकर्ता को क्यों नहीं बुलाता है जब यह पता चलता है कि ऑब्जेक्ट को अब संदर्भित नहीं किया जा सकता है और ऑब्जेक्ट को तुरंत एकत्रित किया जा सकता है? कचरा संग्रह से ज्यादा इसकी आवश्यकता क्यों है?

उत्तर

6

दो बिंदुओं पर विचार करने के लिए:

  • finalizer पूरा करने के लिए कुछ समय लग सकता। उदाहरण के लिए, यह संसाधन या कुछ समान बंद करना समाप्त हो सकता है। आप नहीं चाहते कि वह कचरा संग्रहण समय का हिस्सा बनें, जो काम करने से धागे को अवरुद्ध कर सकता है (जब वे कुछ स्मृति प्राप्त करना चाहते हैं)। अंतिम रूप से अंतिम रूप से चलकर, जीसी स्वयं बहुत जल्दी पूरा कर सकता है, और अंतिमकरण कार्य बाद में अन्य कार्यों के साथ समानांतर में किया जा सकता है।

  • फाइनलर ऑब्जेक्ट को फिर से दृश्यमान बनाकर पुन: जीवंत कर सकता है - लेकिन यह पता लगाने के लिए कि मुझे (मुझे संदेह है) स्मृति की एक और स्वीप की आवश्यकता होगी ... तो अगली बार जब तक यह होने वाला इंतजार क्यों न हो? जिन वस्तुओं पर एक "सामान्य" निहित संदर्भ से पहुंचा जा सकता है, वस्तुओं जो किसी भी निहित संदर्भ द्वारा पहुंच योग्य नहीं कर रहे हैं, और जिन वस्तुओं पर:

3

क्योंकि (जीसी मोड के आधार पर चयनित) जब यह जीसी it has to pause key parts of the runtime प्रदर्शन कर रहा है। इसलिए आप जितना संभव हो उतना जल्दी होना चाहते हैं। यह दो मुद्दों बनाता है:

  1. यह (हालांकि यह एक कठिन सीमा होती है) कब तक finalizer चलाने के लिए ले जाएगा पता नहीं है, और क्रम
  2. क्रम की जरूरत है शुरू करने में देरी नहीं चाहता है finalizer मज़बूती से काम करने के लिए चल रहा हो (भले ही एक जीसी धागा प्रयोग किया जाता है, कोड तुम लिखो क़यास अन्य सूत्र के बारे में परवाह सकता है)

दोनों मुद्दों का समाधान करने के लिए, लंबित finalizers के साथ उन लोगों के लिए कतारबद्ध कर रहे हैं, और फिर मार डाला के बाद जीसी समाप्त हो गया है (जब रनटाइम काम कर रहा है)।

साइड-नोट के रूप में, IDisposable के साथ अंतिमकर्ताओं को गठबंधन करना एक अच्छा अभ्यास है और Dispose() अंतिमकरण रद्द करें; इस तरह इसे बाद में अंतिम रूप देने की आवश्यकता नहीं है, और एक चरण में साफ किया गया है।

0

जब .net कचरा-कलेक्टर चलाता है, वस्तुओं तीन श्रेणियों में विभाजित कर रहे हैं किसी भी "सामान्य" रूट संदर्भ से पहुंच योग्य नहीं है, लेकिन अगर उन्हें छोड़ दिया जाता है, तो पर अधिसूचना प्राप्त करने का अनुरोध किया गया है या ऐसा करने वाले अन्य ऑब्जेक्ट्स से पहुंच योग्य है। कचरा कलेक्टर उस तीसरी श्रेणी में वस्तुओं की एक सूची बनाता है; उस सूची को मूल संदर्भ के रूप में संग्रहीत किया जाता है, जिसमें सभी वस्तुओं को 'लाइव' बना दिया जाता है।सिस्टम उस सूची में वस्तुओं के माध्यम से जाता है, हालांकि, उनके 'अधिसूचना' अनुरोधों को रद्द करता है, उनकी अंतिम() विधि चलाता है, और उन्हें सूची से हटा देता है। यदि ऑब्जेक्ट का कोई संदर्भ कहीं भी नहीं कहा जाता है और किया जाता है, तो ऑब्जेक्ट अगले जीसी चक्र पर "मृत" घोषित किया जाएगा।

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