अपडेट (1 दिसंबर, 2009):
मैं इस उत्तर में संशोधन करना चाहता हूं और माना कि मूल उत्तर त्रुटिपूर्ण था।
मूल विश्लेषण उन वस्तुओं पर लागू होता है जिन्हें अंतिम रूप देने की आवश्यकता होती है - और यह बिंदु कि प्रथाओं को एक सटीक, बिना गहराई के समझ के सतह पर स्वीकार नहीं किया जाना चाहिए।
हालांकि, यह पता चला है कि DataSets, DataViews, DataTables उनके निर्माणकर्ताओं में अंतिम रूप से दबा देते हैं - यही कारण है कि कॉलिंग डिस्पोज () उन पर स्पष्ट रूप से कुछ भी नहीं करता है।
संभवतः, ऐसा इसलिए होता है क्योंकि उनके पास अप्रबंधित संसाधन नहीं होते हैं; इस तथ्य के बावजूद कि MarshalByValueComponent मानव रहित संसाधनों के लिए भत्ते बनाता है, इन विशेष कार्यान्वयनों की आवश्यकता नहीं है और इसलिए इसे अंतिम रूप देना पड़ सकता है।
(उस .NET लेखकों को अंतिम रूप से अंतिम प्रकार के लिए इस अभ्यास के महत्व को सामान्य रूप से सबसे अधिक स्मृति पर कब्जा करने वाले बहुत प्रकार पर कब्जा करने के लिए ध्यान रखना चाहिए।)
इस बात के बावजूद, कि ये विवरण अभी भी .NET फ्रेमवर्क की स्थापना के बाद से अंडर-डॉक्यूमेंटेड हैं (लगभग 8 साल पहले) बहुत आश्चर्य की बात है (कि आप अनिवार्य रूप से अपने स्वयं के उपकरणों के लिए छोड़ रहे हैं, हालांकि टुकड़ों को एक साथ रखने के लिए परस्पर विरोधी, अस्पष्ट सामग्री। कई बार निराशा होती है लेकिन हम जिस रूपरेखा पर प्रतिदिन भरोसा करते हैं, उसकी अधिक संपूर्ण समझ प्रदान करते हैं)।
बहुत पढ़ने के बाद, यहाँ मेरी समझ है:
यदि किसी ऑब्जेक्ट को अंतिम रूप देने की आवश्यकता होती है, तो यह मेमोरी को लंबे समय तक कब्जे में ले सकता है - यहाँ की आवश्यकता क्यों है: ए) कोई भी प्रकार जो एक विध्वंसक को परिभाषित करता है (या एक प्रकार से विरासत में मिला है जो विनाशकारी को परिभाषित करता है) को अंतिम रूप दिया जाता है; ख) आवंटन पर (निर्माता के चलने से पहले), एक सूचक को अंतिम रूप देने वाली कतार पर रखा गया है; ग) एक अंतिम रूप देने वाली वस्तु को सामान्य रूप से 2 संग्रह की आवश्यकता होती है (मानक 1 के बजाय); घ) अंतिम रूप देना दमन को अंतिम रूप देने वाली कतार से कोई वस्तु नहीं हटाता (जैसा कि एसओएस में अंतिम रूप से बताया गया है) यह आदेश भ्रामक है; यह जानना कि वस्तुओं को अंतिम रूप देना कतार में है (और अपने आप में) सहायक नहीं है; यह जानते हुए कि कौन सी वस्तुएं अंतिम रूप से कतार में हैं और अभी भी अंतिम रूप देने में मदद मिलेगी (क्या इसके लिए कोई कमांड है?)
दमन को अंतिम रूप देना ऑब्जेक्ट के हेडर में रनटाइम को इंगित करता है कि उसे अपने अंतिम रूप को लागू करने की आवश्यकता नहीं है (FReachable कतार को स्थानांतरित करने की आवश्यकता नहीं है); यह अंतिम रूप से कतार पर रहता है (और एसओएस में अंतिम रूप से सूचित किया जाता है)
DataTable, DataSet, DataView कक्षाएं सभी MarshalByValueComponent में निहित हैं, एक अंतिम वस्तु जो अप्रबंधित संसाधनों को संभाल सकती है (संभवतः)
- क्योंकि DataTable, DataSet, DataView अप्रबंधित संसाधनों को प्रस्तुत नहीं करते हैं, वे अपने निर्माणकर्ताओं में अंतिम रूप देते हैं
- हालांकि यह एक असामान्य पैटर्न है, यह कॉल करने वाले को उपयोग के बाद Dispose पर कॉल करने की चिंता से मुक्त करता है
- यह और तथ्य यह है कि DataTables संभावित रूप से अलग-अलग DataSets में साझा किए जा सकते हैं, संभवतः इसीलिए DataSets, DataTables को निपटाने की परवाह नहीं करता है
- इसका मतलब यह भी है कि ये वस्तुएं एसओएस में अंतिम रूप से दिखाई देंगी
- हालांकि, इन वस्तुओं को अभी भी एकल संग्रह के बाद पुनः प्राप्त किया जाना चाहिए, जैसे कि उनके गैर-अंतिम योग्य समकक्षों की तरह
4 (नए संदर्भ):
मूल उत्तर:
इस पर बहुत सारे भ्रामक और आम तौर पर बहुत खराब उत्तर हैं - जो कोई भी यहां उतरा है उसे शोर को अनदेखा करना चाहिए और नीचे दिए गए संदर्भों को ध्यान से पढ़ना चाहिए।
बिना किसी संदेह के, निपटान को किसी भी अंतिम वस्तु पर बुलाया जाना चाहिए ।
DataTables हैं Finalizable।
कॉलिंग डिस्पोज मेमोरी की रीक्लेमिंग को काफी तेज कर देता है।
MarshalByValueComponent कॉल GC.SuppressFinalize (यह) अपने निपटान में () - इस लंघन का मतलब है कि स्मृति के पुनःप्राप्त होने से पहले सैकड़ों Gen0 संग्रह नहीं तो दर्जनों का इंतजार करना होगा:
अंतिम रूप देने की इस बुनियादी समझ के साथ हम पहले से ही कुछ बहुत महत्वपूर्ण चीजों को घटा सकते हैं:
सबसे पहले, जिन वस्तुओं को अंतिम रूप देने की आवश्यकता होती है वे उन वस्तुओं की तुलना में अधिक समय तक जीवित रहती हैं जो नहीं करती हैं। वास्तव में, वे बहुत लंबे समय तक रह सकते हैं। उदाहरण के लिए, मान लीजिए कि एक वस्तु जो कि gen2 में है, को अंतिम रूप देने की आवश्यकता है। अंतिम रूप दिया जाएगा, लेकिन ऑब्जेक्ट अभी भी gen2 में है, इसलिए इसे तब तक फिर से एकत्र नहीं किया जाएगा, जब तक कि अगला gen2 संग्रह न हो जाए। यह वास्तव में एक बहुत लंबा समय हो सकता है, और वास्तव में, अगर चीजें अच्छी तरह से चल रही हैं, तो यह एक लंबा समय होगा, क्योंकि gen2 संग्रह महंगा हैं और इस प्रकार हम चाहते हैं कि वे बहुत बार हो सकें। अंतिम स्थान की आवश्यकता वाली पुरानी वस्तुओं को दर्जनों के लिए इंतजार करना पड़ सकता है यदि उनके स्थान से पहले सैकड़ों gen0 संग्रह प्राप्त नहीं होते हैं।
दूसरा, जिन वस्तुओं को अंतिम रूप देने की आवश्यकता होती है, वे संपार्श्विक क्षति का कारण बनती हैं। चूंकि आंतरिक ऑब्जेक्ट पॉइंटर्स वैध रहना चाहिए, न केवल ऑब्जेक्ट्स को सीधे मेमोरी में अंतिम रूप देने की आवश्यकता होगी, बल्कि ऑब्जेक्ट जो कुछ भी संदर्भित करता है, प्रत्यक्ष और अप्रत्यक्ष रूप से, मेमोरी में भी रहेगा। यदि वस्तुओं के एक विशाल वृक्ष को एक एकल वस्तु द्वारा लंगर डाला गया था, जिसे अंतिम रूप देने की आवश्यकता थी, तो संपूर्ण पेड़ लंबे समय तक संभावित रूप से, जैसा कि हमने अभी चर्चा की है। इसलिए महत्वपूर्ण है कि अंतिम रूप से संयोजकों का उपयोग करें और उन्हें उन वस्तुओं पर रखें जो संभव के रूप में कुछ आंतरिक ऑब्जेक्ट पॉइंटर्स हैं। मेरे द्वारा दिए गए ट्री उदाहरण में, आप संसाधनों को एक अलग वस्तु को अंतिम रूप देने और पेड़ की जड़ में उस वस्तु का संदर्भ रखते हुए आसानी से समस्या से बच सकते हैं।
अंत में, अंतिम रूप देने वाली वस्तुओं को अंतिम सूत्र के लिए काम पैदा होता है। यदि आपकी अंतिम प्रक्रिया एक जटिल है, तो केवल और केवल एक अंतिम धागा उन चरणों को पूरा करने में बहुत समय बिताएगा, जो काम के बैकलॉग का कारण बन सकते हैं और इसलिए अधिक वस्तुओं को अंतिम रूप देने के लिए इंतजार कर रहे हैं। इसलिए, यह बहुत महत्वपूर्ण है कि अंतिम रूप से जितना संभव हो उतना कम काम करें। यह भी याद रखें कि हालाँकि सभी ऑब्जेक्ट पॉइंटर्स अंतिम रूप देने के दौरान वैध रहते हैं, लेकिन ऐसा हो सकता है कि वे पॉइंटर्स उन ऑब्जेक्ट्स की ओर ले जाएँ जिन्हें पहले ही अंतिम रूप दिया जा चुका है और इसलिए यह उपयोगी से कम हो सकता है। अंतिम रूप से ऑब्जेक्ट कोड में निम्नलिखित ऑब्जेक्ट से बचने के लिए आम तौर पर सबसे सुरक्षित है, भले ही पॉइंटर्स वैध हों। एक सुरक्षित, छोटा अंतिम कोड पथ सबसे अच्छा है।
इसे किसी ऐसे व्यक्ति से लें, जिसने Gen2 में गैर-संदर्भित डेटाटेबल्स के 100 एमबी को देखा है: यह बेहद महत्वपूर्ण है और इस धागे पर दिए गए उत्तर से पूरी तरह से चूक गया है।
संदर्भ:
1 -
http://msdn.microsoft.com/en-us/library/ms973837.aspx
2 -
http://vineetgupta.spaces.live.com/blog/cns!8DE4BDC896BEE1AD!1104.entry
http://www.dotnetfunda.com/articles/article524-net-best-practice-no-2-improve-garbage -collector प्रदर्शन का उपयोग-finalizedispose-pattern.aspx
3 -
http://codeidol.com/csharp/net-framework/Inside-the-CLR/Automatic-Memory-Management/