2010-11-23 14 views
93

साक्षात्कारकर्ता ने आज मुझसे इस बारे में पूछा ... क्या कोई जवाब है?कचरा कलेक्टर को चलाने के लिए कैसे मजबूर करें?

+3

द्वारा पृष्ठभूमि प्रक्रिया में लगातार चल रहा है इस प्रश्न में अच्छी जानकारी है कि आपको ऐसा क्यों नहीं करना चाहिए: http://stackoverflow.com/questions/118633/ क्या-गलत-उपयोग-उपयोग-जीसी-संग्रह –

+1

आप इस –

+0

की तरह क्यों कह रहे हैं कि यह प्रश्न क्यों नहीं है (क्यों नहीं) सवाल से बहुत कम महत्वपूर्ण है। –

उत्तर

121

System.GC.Collect() बलों को चलाने के लिए कचरा कलेक्टर। यह अनुशंसित नहीं है लेकिन यदि स्थिति उत्पन्न होती है तो इसका उपयोग किया जा सकता है।

+31

+1 "यदि स्थिति उत्पन्न होती है" के लिए +1। –

+1

इसकी अनुशंसा क्यों नहीं की जाती है? –

10
+0

सबसे अच्छा जवाब कभी भी। केवल एक अर्धविराम गायब है ... :( –

12
GC.Collect() 
MDSN से

,

इस विधि का प्रयोग करें सभी स्मृति कि दुर्गम है को पुनः प्राप्त करने के लिए प्रयास करने के लिए।

सभी ऑब्जेक्ट्स, भले ही कितनी देर तक वे स्मृति में हैं, संग्रह के लिए माना जाता है; हालांकि, ऑब्जेक्ट्स जिन्हें प्रबंधित कोड में संदर्भित किया गया है, एकत्र नहीं किए जाते हैं। को अधिकतम मेमोरी उपलब्ध स्मृति को पुनः प्राप्त करने के लिए सिस्टम को मजबूर करने के लिए इस विधि का उपयोग करें।

9

GC.Collect();

, ध्यान रखें, हालांकि, कि कचरा कलेक्टर हमेशा आप क्या उम्मीद को साफ नहीं हो सकता है ...

+4

इसका क्या मतलब है? यह अप्रत्याशित रूप से साफ क्या हो सकता है? – Voldemort

+3

@ वोल्डमॉर्ट - यह अप्रत्याशित रूप से कुछ भी साफ नहीं करेगा। लेकिन यह सबकुछ साफ नहीं कर सकता है जिसे आप उम्मीद करते हैं। –

142

यह जीसी स्पष्ट रूप से कॉल करने के लिए अनुशंसित नहीं है, लेकिन अगर आप

फोन
GC.Collect(); 
GC.WaitForPendingFinalizers(); 

यह जीसी स्पष्ट रूप से अपने कोड भर फोन करेगा, GC.Collect() के बाद GC.WaitForPendingFinalizers(); कॉल करने के लिए मत भूलना।

+7

'WaitForPendingFinalizers' जरूरी नहीं है कि "बेहतर प्रदर्शन" दें: यह केवल तब तक अवरुद्ध हो जाता है जब तक कि अंतिमकरण कतार में सभी ऑब्जेक्ट को अंतिम रूप दिया नहीं जाता है (ऑब्जेक्ट जो आपके पिछले कॉल द्वारा 'संग्रह' पर रखे गए हों)। यदि आप के लिए एक मौका चाहते हैं उन ऑब्जेक्ट्स को इकट्ठा करने के लिए आपको * * कलेक्शन '* कॉल करने के बाद' कलेक्ट 'पर कॉल करने के लिए * एक और * कॉल की आवश्यकता है * – LukeH

+1

क्योंकि जीसी कॉल करने के कुछ अच्छे कारणों में से एक है संसाधनों को मुक्त करने के लिए आखिरी प्रयासों के रूप में है ठीक तरह से निपटान नहीं किया गया है, WaitForPendingFinalizers एक आवश्यक कदम प्रतीत होता है। सुनिश्चित नहीं है कि gc. को कॉल करने से बचने के लिए सबसे अच्छा अभ्यास क्या होगा। हालांकि, ऐसे मामलों में अत्यधिक चयन करें। बीटीडब्ल्यू, मुझे आश्चर्य है कि मैं एफ क्या कोई तकनीकी कारण है कि जीसीओ पीढ़ियों को बढ़ावा देने के लिए 'है' का चयन करें? पीढ़ियों को तब तक रखना उपयोगी लगेगा जब तक कि इसे आगे बढ़ने के औचित्य के लिए पर्याप्त सामान आवंटित नहीं किया जाता है। – supercat

+2

_ सी # _ (मेरे जैसे) में शुरुआती लोगों के लिए नोट: जीसी फोर्स कॉल की गारंटी नहीं है, कुछ कंक्रीट अप्रयुक्त ऑब्जेक्ट को स्मृति से हटा दिया जाएगा। (ऐसा करने का एक तरीका "कथन का उपयोग" (https://msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx) का उपयोग कर रहा है) – user1234567

6

आप कचरा कलेक्टर को चलाने के लिए मजबूर नहीं करना चाहते हैं।

हालांकि, अगर आप कभी (बेशक एक विशुद्ध रूप से शैक्षिक व्यायाम, के रूप में) किया:

GC.Collect() 
+1

मैं @ कार्तिक का उत्तर पसंद करता हूं, वहां ऐसी परिस्थितियां हो सकती हैं जहां एक ऐप को वैध रूप से जीसी कॉल करना चाहिए। हालांकि बहुत ही कम है। –

+1

कहें कि आपके पास कमजोर संदर्भों की एक श्रृंखला थी और यह जांचना चाहता था कि कोई 'लाइव' संदर्भ मौजूद है या नहीं। चेकिंग से पहले जीसी। कोलेक्ट() को कॉल करना समझदारी होगी। बस केह रहा हू। –

1

मुझे लगता है कि नेट फ्रेमवर्क स्वचालित रूप से ऐसा करता है लेकिन बस मामले में। सबसे पहले, क्या आप मिटाना चाहते हैं, का चयन करने के लिए सुनिश्चित करें, और उसके बाद कचरा कलेक्टर फोन:

randomClass object1 = new randomClass 
... 
... 
// Give a null value to the code you want to delete 
object1 = null; 
// Then call the garbage collector to erase what you gave the null value 
GC.Collect(); 

मुझे लगता है कि यह है .. आशा है मैं किसी को मदद करते हैं।

0
GC.Collect(); 

हम कचरा कलेक्टर की विधि एकत्र करके कचरा कलेक्टर कहते हैं। ज्यादातर कचरा कलेक्टर को कॉल करने की कोई आवश्यकता नहीं होती है क्योंकि यह निरंतर थ्रेड

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