c# - मेमोरी लीक सवाल




garbage-collection dispose (2)

मैं इस बारे में बहुत कुछ पढ़ रहा हूं क्योंकि मुझे सी # एप्लिकेशन को ठीक करने के लिए कहा गया है जिसमें मेमोरी लीक की समस्या है, लेकिन मुझे इन 2 मुद्दों के लिए कोई जवाब नहीं मिला है:

निम्नलिखित कोड पर विचार करें:

   private static ArrayList list = new ArrayList();

   public void Function()
   {
     list.add(object1);
     list.add(object2);

     //didn't call clear() prior to reusing list
     list = new ArrayList();
   }

चूंकि एक नई सूची बनाने से पहले सूची को मंजूरी नहीं दी गई थी, क्या यह कुछ कचरा उत्पन्न करेगा जो कि स्थैतिक सूची के निपटान के बाद रिलीज़ नहीं की जाएगी?

दूसरा मुद्दा फॉर्म के बारे में है। मुझे लगता है कि डिज़ाइनर देखने पर बहुत सारे नियंत्रण उपलब्ध हैं (यानी लेबल, चित्र बक्से) की आवश्यकता है निपटान ऐसा प्रतीत होता है कि किसी फॉर्म पर डिस्पोज () को कॉल करने से ये सभी प्रकार के नियंत्रणों का निपटारा भी होता है (मुझे सही करें अगर मुझे गलत हो तो), जो अजीब है क्योंकि डिजाइनर ओवररिडेन व्यूइड डिसाज (बूल डिस्प्लेज़िंग) विधि को जोड़ता है ऐसी कोई बात नहीं। मैं मान रहा हूँ कि यह बेस्ड फॉर्म क्लास के शून्य डिस्पोज़ (बीूल डिस्प्लेज़िंग) विधि पर होता है।

उपरोक्त समस्या यह है कि यह मेरे लिए बहुत स्पष्ट नहीं है कि मुझे यह सुनिश्चित करने के लिए क्या करना चाहिए कि सभी फॉर्म के संसाधनों का सही ढंग से निपटारा होता है मुझे समझ में नहीं आता कि फॉर्म कैसे जानता है कि किस वस्तु को निपटाने की जरूरत है उदाहरण के लिए, यदि मेरे रूप में मेरे पास एक ऐसा क्षेत्र है जो एक कस्टम आईडीिसपोजेबल ऑब्जेक्ट है, तो क्या फॉर्म को पता होना चाहिए कि उसे निपटान की ज़रूरत है? या मुझे वस्तु को अपने आप को जारी करने के लिए आवश्यक कोड जोड़ना चाहिए?

इसके अलावा, अगर मुझे कुछ वस्तुओं को निपटाने के लिए कोड जोड़ना पड़ता है, तो मैं इस तथ्य से कैसे निपटूं कि डिजाइनर ने पहले से ही शून्य निकाला (बाल डिस्प्लेजिंग) पद्धति को ओवरराइड कर दिया है ? क्या मुझे डिजाइनर जनरेटेड कोड संपादित करना चाहिए या ऐसा करने के लिए एक क्लीनर तरीका है?

मुझे उम्मीद है कि यह भ्रमित करने वाला नहीं था, यह समझाने में थोड़ा मुश्किल है धन्यवाद


आपके स्टेटिक सरणी के दायरे क्या हैं मुझे लगता है कि इसमें एक फार्म का दायरा है अगर ऐसा होता है, तो इसका निपटारा नहीं किया जाएगा क्योंकि स्थैतिक वस्तुओं को हमेशा जड़ें माना जाता है और एक आवेदन जीवनकाल होता है। मेरे अनुभव में, स्थिरता हमेशा अधिक मेमोरी लेती है और इस तथ्य के कारण जीन 2 में पदोन्नति की जाती है। यदि आपके कोई संदेह है, तो एक शुद्ध मेमोरी प्रोफाइलर लें और इसे जांचें। आप स्मृति डंप भी ले सकते हैं और लीक के वास्तविक कारण को समझने के लिए विंडबग का उपयोग करके इसका विश्लेषण कर सकते हैं।


नहीं, यह एक रिसाव नहीं है जब कचरा कलेक्टर ऑब्जेक्ट संदर्भों के लिए खोज करता है, तो उसे मूल अर्रे लिस्ट का कोई संदर्भ नहीं मिलेगा। आप इसे बदल दिया। तो यह स्वचालित रूप से उस मूल अर्रेलिस्ट ऑब्जेक्ट को नष्ट कर देगा, साथ ही साथ इसके सभी तत्व यदि कहीं भी संदर्भित नहीं हैं।

प्रपत्र वर्ग जानता है कि वह स्वयं कैसे निपटाना है, साथ ही साथ सभी नियंत्रण जो उस रूप में बाल विंडो हैं यह तब होता है जब उपयोगकर्ता फ़ॉर्म को बंद करता है, WM_CLOSE संदेश जो Windows भेजता है यह कोड ट्रिगर करता है। प्रपत्र। नियंत्रणों का संग्रह सभी बच्चे नियंत्रणों के संदर्भ को खोजने में मदद करता है, ताकि वह उन्हें भी निपटान कर सके।

हालांकि, यह तब नहीं होगा, जब आप अपने नियंत्रण से नियंत्रण हटा दें अब यह उन पर डिस्पोज () को कॉल करने के लिए है विशेष रूप से नियंत्रण। क्लीयर () विधि खतरनाक है। इसके बारे में असामान्य बात यह है कि यह एक स्थायी रिसाव का कारण बनता है, आपके द्वारा निकाले जाने वाले नियंत्रण को 'पार्किंग विंडो' द्वारा जीवित रखा जाता है कौन सा विंडो को जिंदा रखता है ताकि आप उन्हें कहीं और स्थानांतरित कर सकें, उदाहरण के लिए किसी अन्य कंटेनर विंडो पर। अगर आप वास्तव में उन्हें नहीं ले जाते हैं, तो वे उस पार्किंग विंडो पर हमेशा के लिए रहेंगे। ढांचा में कोई अन्य वर्ग इस तरह से व्यवहार नहीं करता है।

यह रिसाव Taskmgr.exe, प्रक्रिया टैब के साथ निदान करना आसान है। देखें + कॉलम का चयन करें और उपयोगकर्ता ऑब्जेक्ट को टिकें। यदि आपका प्रोग्राम तब चला जाता है जब आप लगातार चलते हैं तो आप नियंत्रणों को लीक कर रहे हैं







idisposable