दिलचस्प पोस्ट
स्विफ्ट में Dispatch_Async का उपयोग करते हुए यूआई को अपडेट करना alias to chrome console.log संख्या को दो दशमलव स्थानों पर स्वरूपित करें अपने ऐप को iPhone पर पृष्ठभूमि में चलाने से कैसे रोकें? अलार्म प्रबंधक पहले से ही एक अलार्म सेट क्या है की जांच कैसे करें? यूटीएफ -8 – बीओएम पढ़ना एक्सेल फ़ाइल को पढ़ने और लिखने के तरीके ggplot किंवदंतियों – परिवर्तन लेबल, आदेश और शीर्षक पूर्वप्रक्रमक मैक्रोज़ से मंच / कंपाइलर की पहचान कैसे की जाए? अजगर पांडा के साथ कई कॉलम में चयन करना? WPF संदेशबॉक्स विंडो शैली जावा में स्थिर तरीके क्यों सार नहीं हो सकते क्यों mysqli_insert_id () हमेशा 0 लौट रहा है? मैक पर बंदरगाह 3000 लॉक करना (और मारना) प्रक्रिया Yii फ्रेमवर्क में सीएसएस, जावास्क्रिप्ट फ़ाइल शामिल करें

परिपत्र संदर्भ मेमोरी लीक कारण?

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

माता-पिता के नियंत्रण के माध्यम से बच्चे के फार्म का एक संदर्भ होता है (बाल प्रपत्र वहां एम्बेडेड है)। बाल फार्म जीसीडी नहीं है

बच्चे के फॉर्म में निजी सदस्य फ़ील्ड के माध्यम से, माता-पिता के फॉर्म का संदर्भ है। माता पिता का फ़ॉर्म जीसीडी नहीं है

क्या यह सही समझ है कि कैसे कचरा कलेक्टर स्थिति का मूल्यांकन करेगा? परीक्षण के प्रयोजनों के लिए इसे 'साबित करने' का कोई तरीका?

Solutions Collecting From Web of "परिपत्र संदर्भ मेमोरी लीक कारण?"

बढ़िया सवाल!

नहीं, दोनों रूप जीसी (GD) हो सकते हैं क्योंकि जीसी अन्य संदर्भों में सीधे संदर्भों के लिए नहीं देखता है। यह केवल "रूट" संदर्भों को कहलाता है … इसमें शामिल है … इसमें स्टैक पर संदर्भ चर शामिल हैं, (वेरिएबल स्टैक पर है, वास्तविक ऑब्जेक्ट ढेर पर है), सीपीयू रजिस्टरों में संदर्भ चर, और संदर्भ वेरिएबल वर्गों में स्थिर फ़ील्ड …

अन्य सभी संदर्भ चर केवल (और जीसीडी) तक पहुंचाए जाते हैं यदि उपर्युक्त प्रक्रिया के द्वारा पाया गया "रूट" संदर्भ वस्तुओं में से किसी एक संपत्ति में संदर्भित किया जाता है … (या किसी ऑब्जेक्ट में किसी ऑब्जेक्ट में किसी संदर्भ से संदर्भित , आदि…)

इसलिए केवल अगर किसी एक को "रूट" संदर्भ में कहीं और संदर्भित किया जाता है – तो दोनों रूप जीसी से सुरक्षित होंगे।

एकमात्र तरीका मैं "साबित" करने के बारे में सोच सकता हूं, (मेमोरी ट्रेस उपयोगिताओं का उपयोग किए बिना) एक विधि के अंदर एक लूप में, दो सौ रूपों का एक रूप बनाने के लिए, फिर विधि में, एप के मेमोरी पदचिह्न को देखें , फिर विधि से बाहर निकलें, जीसी को कॉल करें, और फिर से पदचिह्न को देखें।

जैसा कि दूसरों ने पहले ही कहा है, जीसी के परिपत्र संदर्भ में कोई समस्या नहीं है मैं बस जोड़ना चाहूंगा, जो कि एनआईटी में स्मृति को रिसाव करने के लिए एक आम जगह हैं। ईवेंट हैंडलर हैं I यदि आपके फ़ॉर्म में से कोई एक अन्य ऑब्जेक्ट के साथ संलग्न ईवेंट हैंडलर है जो "जीवित" है, तो आपके फ़ॉर्म का एक संदर्भ है और फ़ॉर्म को जीसीडी नहीं मिलेगा।

कूड़ा संग्रह आवेदन जड़ों ट्रैकिंग द्वारा काम करता है अनुप्रयोग जड़ों में भंडारण स्थान होते हैं जिनमें प्रबंधित ढेर (या रिक्त) पर ऑब्जेक्ट के संदर्भ होते हैं। नेट में, जड़ें हैं

  1. वैश्विक वस्तुओं के संदर्भ
  2. स्थैतिक वस्तुओं के संदर्भ
  3. स्थिर क्षेत्रों के संदर्भ
  4. स्थानीय वस्तुओं के ढेर पर संदर्भ
  5. तरीकों को पारित ऑब्जेक्ट मानकों को स्टैक पर संदर्भ
  6. अंतिम रूप देने के लिए प्रतीक्षा करने वाले वस्तुओं के संदर्भ
  7. प्रबंधित ढेर पर ऑब्जेक्ट के लिए CPU रजिस्टर में संदर्भ

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

अब मान लीजिए कि आपके पास एक माता-पिता का फ़ॉर्म है जिसमें बच्चे के रूपों के संदर्भ शामिल हैं और ये बच्चे के रूप में माता-पिता के रूप में संदर्भ होते हैं। इसके अलावा, मान लें कि आवेदन में अब माता-पिता या किसी भी बच्चे के रूपों का कोई संदर्भ नहीं है। फिर, कचरा कलेक्टर के प्रयोजनों के लिए, ये प्रबंधित ऑब्जेक्ट अब जड़ें नहीं रहेंगे और अगली बार एक कूड़ा संग्रह तब होता है जब कचरा इकट्ठा होता है।

यदि दोनों माता-पिता और बच्चे संदर्भित नहीं हैं, लेकिन वे केवल एक दूसरे को संदर्भ देते हैं, तो वे जीसीईडी प्राप्त करते हैं।

वास्तव में आपकी एप्लिकेशन की जांच करने और आपके सभी सवालों के जवाब देने के लिए मेमोरी प्रोफाइलर प्राप्त करें। मैं सुझा सकता हूँ http://memprofiler.com/

मैं घटनाओं के बारे में विलक्स की टिप्पणी को गूंजना चाहता हूं, और एक डिज़ाइन पैटर्न की अनुशंसा करना चाहता हूं जो इसे संबोधित करने में सहायता करता है।

मान लीजिए कि आपके पास एक ऐसा प्रकार है जो एक इवेंट स्रोत है, जैसे:

interface IEventSource { event EventHandler SomethingHappened; } 

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

कौन सा निपटान का मुद्दा लाता है किसी भी वर्ग जो घटनाओं का सब्सक्राइब कर लेता है IDisposable इंटरफ़ेस को लागू करना चाहिए क्योंकि इवेंट प्रबंधित संसाधन हैं। (एनबी मैंने संक्षिप्तता के खासतौर पर उदाहरण में पैटर्न का एक उचित कार्यान्वयन छोड़ दिया है, लेकिन आपको यह विचार मिलता है।)

 class MyClass : IDisposable { IEventSource m_EventSource; public IEventSource EventSource { get { return m_EventSource; } set { if( null != m_EventSource ) { m_EventSource -= HandleSomethingHappened; } m_EventSource = value; if( null != m_EventSource ) { m_EventSource += HandleSomethingHappened; } } } public Dispose() { EventSource = null; } // ... } 

जीसी परिपत्र संदर्भों के साथ सही तरीके से निपट सकता है और यदि इन संदर्भों को केवल जीवित रूप में रखने वाले चीजें थीं तो उन्हें एकत्र किया जाएगा।
मेरे पास बहुत सारी समस्याएं हैं, चूंकि फॉर्म से मेमोरी को पुनः प्राप्त नहीं किया जा रहा है। 1.1 में कुछ बग मेनुइटम (मुझे लगता है) की वजह से थे, जिसका अर्थ था कि उनका निपटान नहीं हुआ और स्मृति को रिसाव कर सकता था। इस मामले में, समस्या के हल के फार्म के निपटान विधि में सदस्य चर को निपटाने और निकालने के लिए एक स्पष्ट कॉल जोड़ना हमने पाया कि इसने कुछ अन्य नियंत्रण प्रकारों के लिए स्मृति को पुनः प्राप्त करने में भी मदद की है।
मैंने सीएलआर प्रोफाइलर के साथ एक लंबा समय बिताया है कि क्यों फ़ॉर्म्स एकत्र नहीं किए जा रहे थे। जहाँ तक मैं बता सकता हूं, संरचनाएं ढांचे द्वारा रखी गई थीं। प्रत्येक प्रकार के प्रकार इसलिए यदि आप फॉर्म 1 के 100 उदाहरण बनाते हैं, तो उन सभी को बंद करें, केवल 99 को ठीक से पुनः प्राप्त किया जाएगा। मुझे इसका इलाज करने का कोई तरीका नहीं मिला।
हमारे आवेदन के बाद से .net 2 में स्थानांतरित कर दिया गया है और यह बहुत अच्छा लगता है। हमारा आवेदन मेमोरी अभी भी बढ़ जाता है जब हम पहला फॉर्म खोलते हैं और बंद होने पर वापस नहीं जाते हैं, लेकिन मेरा मानना ​​है कि यह जेआईटी के कोड और लोड किए जाने वाले अतिरिक्त नियंत्रण पुस्तकालयों के कारण है।
मैंने यह भी पाया है कि जीसी परिपत्र संदर्भों से निपट सकता है, हालांकि, यह परिपत्र ईवेंट हैंडलर संदर्भों के साथ समस्या (कभी-कभी) लगता है। IE ऑब्जेक्ट 1 संदर्भ ऑब्जेक्ट 2 और ऑब्जेक्ट 1 में एक ऐसी विधि है जो ऑब्जेक्ट 2 से संभालती है और घटना है। मुझे ऐसी परिस्थितियों का पता चला है जहां मैंने उम्मीद की थी, लेकिन जब मैं किसी परीक्षण के मामले में इसे फिर से नहीं बना पाता था,