2010-06-19 14 views
5

क्या प्रोग्रामर के लिए सी # प्रोग्रामिंग भाषा में कचरा संग्रह को प्रोग्रामेटिक रूप से प्रारंभ/बंद करना संभव है? उदाहरण के लिए, प्रदर्शन अनुकूलन और इसी तरह के लिए।क्या .NET कचरा संग्रह को रोकना संभव है?

+1

कचरा संग्रह सी # प्रोग्रामिंग भाषा का हिस्सा नहीं है। यह .NET CLR का हिस्सा है। –

+0

"किंडा।" यदि आप कभी भी कुछ आवंटित नहीं करते हैं, तो जीसी कभी एकत्र नहीं करेगा। आपको जो भी चाहिए उसे पूर्व-आवंटित करें और फिर 'जीसी। कोलेक्ट() 'पर कॉल करें। –

+0

शायद इस उत्तर को भी देखें: http://stackoverflow.com/questions/6005865/prevent-net-garbage-collection-for-short-period-of-time/6005949#6005949 – Gamlor

उत्तर

6

वास्तव में नहीं। आप GC संकेतों को GC.AddMemoryPressure या GC.RemoveMemoryPressure जैसी विधियों के माध्यम से संकेत दे सकते हैं लेकिन इसे सीधे नहीं रोक सकते हैं।

इसके अलावा, कचरा संग्रह एक प्रक्रिया की गहन नहीं है। प्रोग्रामर बहुत ही कम कभी इसके बारे में चिंता करते हैं।

+0

तय करेगा ओह, मैं देखता हूं ... SuppressFinalize() विधि के बारे में कैसे? क्या इसका एक अलग उद्देश्य है? – Alex

+0

SuppressFinalize व्यक्तिगत वस्तुओं पर काम करता है। निश्चित रूप से पूरे जीसी पर नहीं। एमएसडीएन से: ऑब्जेक्टिव इंटरफेस को लागू करने वाले ऑब्जेक्ट्स इस विधि को आईडीस्पोजेबल से कॉल कर सकते हैं। ऑब्जेक्ट को कॉल करने से कचरा कलेक्टर को रोकने के लिए विधि का प्रयोग करें। उस ऑब्जेक्ट पर फ़िनलाइज़ करें जिसके लिए इसकी आवश्यकता नहीं है। (इसलिए मूल रूप से यह एक बहुत ही मामूली प्रदर्शन वृद्धि है।) –

+0

मुझे नहीं लगता कि यह * रोकथाम * कचरा संग्रह, प्रति-सी के लिए संकेत कैसे जोड़ देगा; यदि आप 'जीसी.एडएममोरी प्रेसर' कहते हैं तो सीएलआर बनाने में अधिक संभावना होगी * अधिक * कचरा संग्रह क्योंकि यह इंगित करता है कि प्रक्रिया के लिए सीएलआर के लिए उपलब्ध स्मृति (आभासी या अन्यथा) यह सोचने से कम है। सीएलआर को ट्रिक करने के प्रयास में, 'जीसी.एडमेमोरी प्रेसर' को इसी कॉल के बिना 'जीसी.एडमोमरीप्रेसर' को कॉल करने के लिए 'जीसी। रीमूव मेमोरीप्रेस' को कॉल कर सकता है, यह सोचने में कि इसकी तुलना में अधिक मेमोरी है, लेकिन कोई सोचता है कि एपीआई प्रतिरोधी है (एक होगा उम्मीद है) ऐसी चीजों के लिए। – casperOne

3

नहीं, ऐसा नहीं है। सबसे अच्छा आप कचरा संग्रह स्वयं को ट्रिगर कर सकते हैं, हालांकि इसे बहुत खराब बात माना जाता है क्योंकि यह जीसी द्वारा उपयोग किए गए शेड्यूलिंग एल्गोरिदम में निर्मित हस्तक्षेप कर सकता है।

+0

आप संग्रह को ट्रिगर नहीं कर सकते , बस "सुझाव" कर सकते हैं। जीसी खुद ही –

4

सामान्य रूप से, नहीं। और अधिकांश लोग इसे कचरा संग्रह के बारे में चिंता करने के लिए समयपूर्व अनुकूलन मानेंगे जबतक कि आप कुछ प्रोफाइलिंग नहीं करते हैं और यह पता लगाते हैं कि यह वास्तव में आपके आवेदन में खराब प्रदर्शन का कारण है।

आप प्रदर्शन के लिए जी सी में सुधार करने के लिए (या अधिक होने की संभावना, जीसी करने के लिए अपने प्रदर्शन में सुधार करने के रिश्तेदार अपने अनुप्रयोग में सुधार करने) के वास्ते में रुचि रखते हैं, MSDN तरीके यह करने के लिए की एक बहुत सभ्य विवरण नहीं है।

GC.TryStartNoGCRegion(...) और GC.EndNoGCRegion():

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