2011-03-07 22 views
8

के दौरान जेन 2 को बढ़ावा दिया गया है, मेरा प्रोग्राम जेन 2 को बहुत उच्च दर (लगभग 1 एमबी/सेक) पर स्मृति को बढ़ावा दे रहा है और जब जेन 2 संग्रह होता है तो यह प्रदर्शन हिट का कारण बनता है। प्रत्येक प्रयास को मैंने समझने के लिए बनाया कि कौन सी वस्तुओं को बढ़ावा दिया गया था असफल रहा - मुख्य रूप से इस तथ्य के कारण कि जब मैंने विंडबग में 2 डंप खोले, तो जिस स्मृति से जीन 2 आकार की वृद्धि हुई थी, उसे "फ्री" के रूप में चिह्नित किया गया था। इससे मुझे संदेह हुआ कि पिन की गई समस्याएं समस्या पैदा कर रही हैं लेकिन परफॉर्म आंकड़े बताते हैं कि पिन की गई वस्तुओं में से # बहुत कम है (लगभग 2-4)।नेट कचरा कलेक्टर - देखें कि रनटाइम

मैं अब कोशिश करने के बारे में क्या सोच रहा हूं यह किसी भी तरह से यह पता चलता है कि कौन सी ऑब्जेक्ट्स को रनटाइम में जेन 2 में बढ़ावा दिया जाता है। क्या ऐसा करने के लिए कोई तरीका है?

+1

मुझे संदेह है कि आप अपने डिस्पोजेबल ऑब्जेक्ट्स का निपटान नहीं करते हैं। सबसे अवांछित वस्तुएं उनके फाइनलजर को चलाएंगी और वहां से निपटान करेंगी। फाइनलाइजर्स जीसी संग्रह ब्लॉक [सेक्शन "कैसे अंतिमकरण संग्रह को प्रभावित करता है"] (http://msdn.microsoft.com/en-us/library/ms973837.aspx#dotnetgcbasics_topic5)। –

+1

क्या आप बड़ी वस्तुओं को आवंटित कर रहे हैं? बड़ी वस्तु ढेर पर आवंटित AFAIK ऑब्जेक्ट्स जेन 2 पर तुरंत जाते हैं। – CodesInChaos

उत्तर

5

आप ऐसे मुद्दों को डीबग करने के लिए WinDbg का उपयोग कर सकते हैं। कचरा संग्रहण दिनचर्या पर ब्रेकपॉइंट सेट करें, प्रबंधित ढेर की जांच करें, कचरा संग्रह होने दें, फिर प्रबंधित हेप की जांच करें ताकि यह देखने के लिए कि जेन 2 में कौन सी वस्तुएं हैं।

यहाँ के साथ शुरू करने के लिए कुछ लिंक कर रहे हैं:

Tracking down managed memory leaks

How to iterate on the objects present in the .NET managed heap?

Tess Ferrandez' blog

Investigating .NET Memory Management and Garbage Collection

क्षमा करें कि आपके प्रश्न का सीधा, विस्तृत जवाब नहीं है, लेकिन यह आपको एक शुरुआती बिंदु देना चाहिए।

+0

स्ट्राइक लोड करने के लिए WinDBG का उपयोग करने की आवश्यकता नहीं है, क्योंकि वीएस2003 ब्रेकपॉइंट पर रुकने पर "तत्काल" विंडो के माध्यम से लोड हो सकता है। 2010 के लिए डॉक्स - http://msdn.microsoft.com/en-us/library/yy6d2sxs.aspx - बिंग में अन्य संस्करणों के लिए निर्देश। – stephbu

1

आप बहुत सारे LOH आवंटित किए जा सकते हैं। LOH आवंटन पर ब्रेक-पॉइंट होने का एक तरीका यहां दिया गया है। Winbdg के भीतर bp mscorwks!wks::gc_heap::allocate_large_object “!CLRStack”

HTH

0

एक स्नैपशॉट तुरंत यह

GC.Collect(1,GCCollectionMode.Forced); 
GC.WaitForPendingFinalizers(); 
CreateDump(); 

भी चल रहा है खत्म, जीसी स्वाद किस तरह अपने प्रयोग कर रहे हैं के बाद आप के लिए मजबूर जनरल (0) और जनरल (1) संग्रह कोशिश करते हैं और हो सकता है?

2

कुछ 3 पार्टी memory profilers for .NET हैं, उन्हें आज़माएं, उनमें से अधिकतर आपको निःशुल्क परीक्षण अवधि की अनुमति देते हैं। मुझे उम्मीद है कि किसी भी अग्रणी मेमोरी प्रोफाइलर्स आपको यह देखने देगा कि जल्दी क्या हो रहा है।

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