में निहित सी # शब्दकोश से स्मृति को हटा दें मुझे डब्ल्यूसीएफ वेब सेवा (कुछ डंप, मेमोरी लीक इत्यादि) के साथ कुछ समस्याएं थीं और मैं एक प्रोफाइलिंग टूल (एएनटीएस मेमोरी प्रोफाइल) चलाता हूं।एक स्थिर वस्तु
बस यह पता लगाने के लिए कि प्रसंस्करण के साथ (मैं एक विशिष्ट परीक्षण चलाता हूं और फिर बंद कर देता हूं), जेनरेशन 2 वेब सेवा के लिए स्मृति का 25% है। मैंने इस मेमोरी को ट्रैक करने के लिए ट्रैक किया कि मेरे पास एक हैश ऑब्जेक्ट था (शून्य, शून्य) आइटम, -1 हैश कोड के साथ।
वेब सेवा का वर्कफ़्लो तात्पर्य है कि विशिष्ट प्रसंस्करण वस्तुओं को जोड़ा जाता है और फिर शब्दकोश से हटा दिया जाता है (केवल सरल Add
और Remove
)। कोई बड़ी बात नहीं। लेकिन ऐसा लगता है कि सभी वस्तुओं को हटा दिए जाने के बाद, शब्दकोश (शून्य, शून्य) KeyValuePair
एस से भरा हुआ है। वास्तव में उनमें से हजारों, जैसे कि वे स्मृति का एक बड़ा हिस्सा लेते हैं और अंततः एक अतिप्रवाह होता है, इसी तरह के मजबूर अनुप्रयोग पूल रीसायकल और डीडब्ल्यू 20.एक्सई को सभी सीपीयू चक्र मिलते हैं।
शब्दकोश वास्तव में Dictionary<SomeKeyType, IEnumerable<KeyValuePair<SomeOtherKeyType, SomeCustomType>>>
(System.OutOfMemoryException because of Large Dictionary) है इसलिए मैंने पहले ही जांच की है कि कुछ प्रकार की संदर्भ होल्डिंग चीजें हैं।
शब्दकोष एक स्थिर वस्तु (इसे प्रोसेसिंग के माध्यम से विभिन्न प्रसंस्करण धागे के लिए एक्सेसिबल बनाने के लिए) में निहित है, इसलिए इस प्रश्न से और कई और (Do static members ever get garbage collected?) मुझे समझ में आता है कि यह शब्दकोश जनरेशन 2 में क्यों है। लेकिन यह भी कारण है उनमें से (शून्य, शून्य)? यहां तक कि अगर मैं शब्दकोश से वस्तुओं को हटा देता हूं तो भी स्मृति में हमेशा कब्जा कर लिया जाएगा?
यह इस प्रश्न में Deallocate memory from large data structures in C# की गति गति नहीं है। ऐसा लगता है कि स्मृति कभी पुनः प्राप्त नहीं की जाती है।
क्या कुछ ऐसा है जो मैं वास्तव में शब्दकोश से वस्तुओं को हटाने के लिए कर सकता हूं, न केवल इसे (शून्य, शून्य) जोड़े के साथ भरना? क्या मुझे कुछ और जांचने की ज़रूरत है?
+ !: उचित शोध करने और एक अच्छा प्रश्न लिखने के लिए। – Virtlink
'सूची <> 'में' TrimExcess() 'विधि है,' शब्दकोश <,> दुर्भाग्यवश नहीं है। सोचा यह एक आसान स्कोर था :) –
शब्दकोश कॉलिंग करता है। क्लीयर() कोई फर्क पड़ता है? – Alex