2017-06-10 15 views
5

मेरे पास कुछ कोड है जो मुझे संदेह है कि स्मृति लीक हो रही है। कोड ccall का उपयोग करता है और पॉइंटर्स के अंदर आयोजित महत्वपूर्ण जानकारी को बनाए रखता है, जिसे ccall एड finalizer एस के दौरान कोड द्वारा मुक्त किया जाना चाहिए।'gc()' मैन्युअल रूप से कॉल कर रहा है, परिणामस्वरूप सभी 'अंतिमकर्ता' तुरंत निष्पादित किए जा रहे हैं?

मेरी डीबगिंग में मैं gc() पर कॉल कर रहा हूं। और मैं जानना चाहता हूं कि यह तुरंत finalizer एस को ट्रिगर करेगा जो

उत्तर से जुड़ी ऑब्जेक्ट्स से जुड़े हुए हैं, केवल जूली 0.5+ के साथ चिंतित होना चाहिए।

उत्तर

4

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

यदि एक वस्तु नहीं पहुंचा जा सकता है और आप gc() पर कॉल करेंगे इसे

जो कि स्पष्ट स्पष्ट कट है। स्थानीय स्तर पर gc() पर कॉल करते समय शीर्ष-स्तरीय भाग महत्वपूर्ण है, स्थानीय संदर्भों को पहुंचने योग्य माना जा सकता है या नहीं, भले ही वे कभी भी उपयोग नहीं किए जाएंगे।

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

  • एक सिंगलटन प्रकार का अनूठा उदाहरण स्थायी है और एकत्र कभी नहीं किया जाएगा या अंतिम रूप दे दिया;

  • विधि कैश भी स्थायी हैं, जो विशेष रूप से, इसका मतलब है कि मॉड्यूल मुक्त नहीं होते हैं जब आप अन्यथा उम्मीद कर सकते हैं कि विधि कैश उन मॉड्यूल के संदर्भों को संदर्भित करते हैं जिनमें उन्हें परिभाषित किया गया है।

के तहत हालांकि "सामान्य परिस्थितियों" - जो है मैं क्या संदेह है इस सवाल पर हो रही है - हाँ, gc() बुला एक वस्तु नहीं रह पहुंच योग्य होगा है जब यह एकत्र होने के लिए कारण और "तुरंत" को अंतिम रूप दिया, यानी gc() कॉल रिटर्न से पहले।

+0

यह एक अच्छा जवाब स्टीफन है। क्या यह कहना उचित होगा कि यह केवल वर्तमान जीसी() कार्यान्वयन का सच है, और यह भाषा अनुबंध नहीं है? यानी, यह व्यवहार भविष्य में बदल सकता है। उदाहरण के लिए, अगर और जब हम बहु-थ्रेडेड जीसी प्राप्त करते हैं? – aviks

+0

हां, अगर हमें एक समवर्ती जीसी मिलती है, तो सभी दांव बंद होते हैं - लेकिन हमें इसके प्रभाव पर विचार करना होगा। एक समवर्ती जीसी में, म्यूटेटर थ्रेड और कलेक्टर थ्रेड होते हैं जो एक ही समय में चलते हैं, इसलिए यह पूरी तरह स्पष्ट नहीं है कि यह एक म्यूटेटर थ्रेड में 'gc() 'को कॉल करने का भी अर्थ है। इसे संभावित रूप से म्यूटेटर थ्रेड को अवरुद्ध करने के लिए व्यवस्थित किया जा सकता है जिसमें इसे कलेक्टर थ्रेड में "पूर्ण संग्रह" होने तक बुलाया जाता है। या यह समवर्ती संग्राहक के स्थान पर एक स्टॉप-द-वर्ल्ड जीसी एल्गोरिदम का आह्वान कर सकता है, लेकिन फिर हमारे पास दो अलग-अलग जीसी कार्यान्वयन हैं, जो अजीब होंगे। – StefanKarpinski

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