कूड़ा उठाने वाले को कैसे चलाना है मजबूर?


147

साक्षात्कारकर्ता ने आज मुझसे इस बारे में पूछा ... क्या कोई उत्तर है?


3
इस सवाल के बारे में अच्छी जानकारी है कि आपको ऐसा क्यों नहीं करना चाहिए: stackoverflow.com/questions/118633/…
हंस ओल्सन

1
आप ऐसा क्यों कह रहे हैं
एंड्रयू कॉलिन्स

1
@ जेसन - हो सकता है कि साक्षात्कारकर्ता समाधान नहीं सुनना चाहते थे, बल्कि एंड्रयू के ज्ञान और इसे करने के खिलाफ तर्क प्राप्त करना चाहते थे, फिर यह प्रश्न प्रभावी रूप से समझ में आ सकता था।
Martinstoeckli

2
@martinstoeckli यह अभी भी एक भयानक सवाल है। एक तनावपूर्ण साक्षात्कार में ज्ञान के साथ किसी को यह एहसास नहीं होगा कि यह एक मुश्किल सवाल है, या अतिरिक्त जानकारी की आपूर्ति करने के लिए सोचें। फिर सवाल यह है कि साक्षात्कारकर्ता ज्ञान के साथ या बिना किसी के बीच अंतर करने में मदद नहीं करता है। इसलिए सवाल अभी भी भयानक है।
जेम्स

2
"आप कचरा संग्रहण कब लागू करते हैं?" मुझे एक अच्छा साक्षात्कार प्रश्न लगता है ("कैसे": इतना नहीं)। शुरुआत: मुझे पता नहीं है। इंटरमीडिएट: कभी नहीं। विशेषज्ञ: जब आप मेमोरी लीक के लिए एक परीक्षण लिखते हैं।
mikebridge

जवाबों:


188

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


17
क्यों अनुशंसित नहीं है?
ल्यूक टी ओ'ब्रायन

5
GC.Collect () चलाना महंगा है। आवश्यकता से अधिक करना अनुचित है। यह कब कहा जाना चाहिए, इसके लिए कोड अच्छी तरह से लिखा गया है। आपको विशेष रूप से विशिष्ट मामलों में केवल स्व-संग्रह करना चाहिए। stackoverflow.com/a/21961777/2710988
ब्रैंडन बार्कले

186

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

GC.Collect();
GC.WaitForPendingFinalizers();

यह आपके पूरे कोड में GC को स्पष्ट रूप से कॉल करेगा, इसके GC.WaitForPendingFinalizers();बाद कॉल करना न भूलें GC.Collect()


14
WaitForPendingFinalizersआवश्यक रूप से "बेहतर प्रदर्शन" नहीं देता है: यह बस तब तक अवरुद्ध करता है जब तक कि अंतिम कतार में सभी वस्तुओं को अंतिम रूप नहीं दिया जाता है (ऐसी वस्तुएं जो आपके पिछले कॉल द्वारा वहां डाल दी गई हों Collect)। यदि आप चाहते हैं उन लोगों के लिए एक मौका तो एकत्र होने के लिए आप की जरूरत की वस्तुओं एक और करने के लिए कॉल Collect के बाद फोन कर WaitForPendingFinalizers
ल्यूक

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

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

कॉल करना महत्वपूर्ण क्यों माना जाता है WaitForPendingFinalizers?
क्रिश्चियन

19
GC.Collect() 

से MDSN ,

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

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



12

GC.Collect();

हालांकि, ध्यान रखें कि कूड़ा उठाने वाला हमेशा आपकी अपेक्षा के अनुरूप सफाई नहीं कर सकता है ...


5
उससे तुम्हारा क्या मतलब है? यह अप्रत्याशित रूप से क्या साफ कर सकता है?
वोल्डेमॉर्ट

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

6

आप कचरा संग्रहकर्ता को चलने के लिए बाध्य नहीं करना चाहते हैं।

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

GC.Collect()

4
मैं @ कार्तिक का जवाब पसंद करता हूं, ऐसी परिस्थितियां हो सकती हैं जहां एक ऐप को वैध रूप से GC.Collect () कॉल करना चाहिए। हालांकि बहुत कम ही।
हेन्क होल्टरमैन

2
कहते हैं कि आपके पास कमजोर संदर्भों की एक सरणी थी और यह जांचना चाहता था कि कोई 'लाइव' संदर्भ मौजूद है या नहीं। जाँच करने से पहले GC.Collect () को कॉल करना समझदारी होगी। बस केह रहा हू।
रिच एहमर

1
डाउनवोट किया गया क्योंकि उद्घाटन कथन तथ्यात्मक रूप से गलत है; हां, मैं कचरा इकट्ठा करने वाले को चलने के लिए मजबूर करना चाहता हूं।
Syndog

5

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

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();

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.