मैं इंटरऑप का उपयोग कर .NET से COM ऑब्जेक्ट का उपयोग कर रहा हूं। ऑब्जेक्ट मूल रूप से सॉकेट से डेटा लाता है और प्रक्रिया के लिए .NET परत के लिए कुछ ईवेंट आग लगाता है। हालांकि, थोड़ी देर के बाद, COM ऑब्जेक्ट फायरिंग घटनाओं को रोकता है जो बाद में पता चला क्योंकि यह जीसी द्वारा एकत्रित किया गया है।क्या यह COM ऑब्जेक्ट कचरा संग्रह के अधीन है?
स्रोत कोड की संरचना नीचे इस एक के समान है:
static void Main(string[] args)
{
MyEventGen gen = new MyEventGen();
WeakReference wr = new WeakReference(gen);
gen.ReceiveDataArray +=
new _IMyEventGenEvents_ReceiveDataArrayEventHandler(gen_ReceiveDataArray);
while (true)
{
Thread.Sleep(1000);
Console.WriteLine(wr.IsAlive);
}
}
static void gen_ReceiveDataArray(ref Array indices, ref Array values)
{
// do nothing
}
क्या मैं अब तक पता:
मैं क्या समझ से, वस्तु
gen
shouldn किसी भी तरह से कचरा इकट्ठा नहीं किया जाएगा। चूंकि ऑब्जेक्टMain
दायरे में अभी भी सक्रिय है। लेकिन परिणाम अब तक दिखाता है कि वस्तु जीसी द्वारा एकत्र की गई थी।ऑब्जेक्ट केवल कचरा-संग्रहित होता है जब डिबग किए बिना रिलीज़ और चलाया जाता है। डीबग को चलाने/डीबगर के तहत दोनों मोड चलाना ठीक है।
कार्यक्रम पहले जनरल # 0 संग्रह के ठीक बाद पहले "गलत" प्रिंट करेगा।
while
लूप में ऑब्जेक्ट तक पहुंचकर, उदा।Console.WriteLine(gen.ToString())
, इसे जीसीएडी होने से रोकें!Program
कक्षा का एक और स्थैतिक क्षेत्र जोड़कर इसके संदर्भ को जीसीएडी से भी रोकें।विभिन्न लोड डेटा के साथ प्रयास करते हुए, मैंने पाया कि जीसी केवल ऑब्जेक्ट एकत्र करता है जब निजी बाइट ~ 3X एमबी की सीमा तक पहुंचते हैं।
CLRProfiler साथ जाँच हो रही है, का उल्लेख किया वस्तु के रूप में संदिग्ध GC'd किया गया था।
क्या मैंने कुछ महत्वपूर्ण .NET जीसी की अवधारणाओं को याद किया है? क्या GC'd होने वाली वस्तु का कारण प्राप्त करना संभव है? क्या यह संभवतः एक ज्ञात जीसी बग है?
मैं उपयोग कर रहा हूँ 2008 + .NET 3.5 SP1। अपने विचारों की सराहना करें। धन्यवाद!
धन्यवाद डारिन! ऐसा लगता है कि मैं इन सभी वर्षों में जीसी प्रक्रिया को गलत समझाता हूं: ') – Gant
@ m3rLinEz, बात यह है कि रिलीज मोड में कई अनुकूलन किए जाते हैं और जीसी वास्तव में आक्रामक हो सकता है। यह समझने में सक्षम है कि 'जीन' चर का उपयोग अब अंतिम पहुंच के बाद नहीं किया जाता है और इसे एकत्रित किया जाता है। एक स्थैतिक चर के रूप में जीन को रखने से इसे रोकने से रोका जाना चाहिए। –