2010-09-01 15 views
5

डॉटट्रेस प्रदर्शन प्रोफाइलर का मतलब क्या है [कचरा संग्रह]?

इस तस्वीर में [कचरा संग्रहण] का क्या अर्थ है? और "20 कॉल" चीज?

मेरा मतलब है, मैं कैसे समझ सकता हूं कि जीसी इतनी देर क्यों ली? क्या यह बहुत छोटी वस्तुओं को इकट्ठा कर रहा था? एक बड़ा बड़ा? इस बारे में कोई संकेत है कि इसे कैसे अनुकूलित किया जाए?

कोड सवाल में है:

private void DeserializeFrom(SerializationInfo info) 
{ 
    Width = info.GetInt32("width"); 
    Height = info.GetInt32("height"); 
    var data = (List<byte>)info.GetValue("cells", typeof(List<byte>)); 
    cells = new Cell[physicalSize.Width, physicalSize.Height]; 
    int pos = 0; 
    for (int x = 0; x < physicalSize.Width; x++) 
    { 
     for (int y = 0; y < physicalSize.Height; y++) 
     { 
      cells[x, y] = new Cell(); 
      if (x < Width && y < Height) 
      { 
       cells[x, y].HasCar = data[pos]; 
       pos++; 
      } 
     } 
    } 
} 

कुछ नहीं भी फैंसी। मुझे संदेह है कि अपराधी बड़ा List<byte> ऑब्जेक्ट है, लेकिन मैंने सोचा कि एकल, बड़े ऑब्जेक्ट को तत्काल माना जाना चाहिए (छोटी वस्तुओं के समूह को इकट्ठा करने के विपरीत)।

उत्तर

1

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

कचरा संग्रह तब भी होता है जब रनटाइम आवंटन को प्रबंधित करने और एप्लिकेशन के लिए स्मृति की रिहाई का समय लेता है। इस मामले में यही हो रहा है।

कृपया इस फ़िल्टर को देखें जो डॉटट्रेस (मेरे पास संस्करण 6 है) के साथ उपयोग किया जा सकता है ताकि आप कचरा संग्रह का विश्लेषण कर सकें और यह निर्धारित कर सकें कि यह आपके निष्पादन को अवरुद्ध कर सकता है। https://www.jetbrains.com/profiler/help/CLR_Activity.html

+0

मुझे एहसास है कि यह कुछ महीने पुराना है, लेकिन मुझे लगता है कि यह बिल्कुल उल्लेखनीय है कि आप पूरी तरह से .NET कोड में मेमोरी लीक कर सकते हैं। स्टेटिक घटनाएं इसका एक बहुत ही आम कारण हैं। यदि आप एक क्षणिक स्थिति के साथ एक स्थिर घटना की सदस्यता लेते हैं और क्षणिक के सभी ज्ञात संदर्भों को जारी करने से पहले घटना से सदस्यता समाप्त करने में विफल रहते हैं, तो क्षणिक घटना से संदर्भ द्वारा क्षणिक को जीवित रखा जाएगा; कचरा कलेक्टर कभी इसे इकट्ठा नहीं करेगा। – Kelsie

+0

@kelsie आप सही हैं और मैंने स्वयं को सही ढंग से व्यक्त नहीं किया है। आपके पास अप्रबंधित कोड के साथ प्रोग्राम करने के तरीके के संबंध में स्मृति रिसाव नहीं है, जहां किसी ऑब्जेक्ट को ठीक से डिलीकेट नहीं करना आसान था और मेमोरी रिसाव था। साथ ही, आप सही तरीके से इंगित करते हैं, घटनाएं एक ऐसा तरीका है जिसमें आप किसी ऑब्जेक्ट का संदर्भ रख सकते हैं ताकि इसे निपटान न किया जा सके। – xmorera

+0

एलओएच में आवंटित किए गए सरणी के उपयोग में आपका आवेदन बहुत गहन था और यह देखते हुए कि आप LOH को कॉम्पैक्ट नहीं कर पाएंगे, इससे पहले कि आप मेमोरी अपवादों से बाहर निकल सकें, इससे पहले कि अन्य एप्लिकेशन बड़े ऑब्जेक्ट ढेर के साथ प्री 4.5 में था। – xmorera

2

आप पता लगाने के लिए पैदा कर रहा जेंटलमैन कैडेट, क्या वस्तुओं आवंटित किया जा रहा है और एकत्र है क्या चाहते हैं, तो आप यह dotMemory के माध्यम से कर सकते हैं। यहां एक ट्यूटोरियल है जो बताता है कि मेमोरी ट्रैफ़िक को कैसे अनुकूलित किया जाए: https://confluence.jetbrains.com/display/NETCOM/Tutorial+3+-+How+to+Optimize+Memory+Traffic+with+dotMemory

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