2012-10-15 12 views
5

मैंने सी # में एक लंबा टीसीपी कनेक्शन सॉकेट सर्वर लिखा था। मेरे सर्वर में स्मृति में स्पाइक होता है। मैंने डॉटनेट मेमोरी प्रोफाइलर (एक उपकरण) का उपयोग यह पता लगाने के लिए किया था कि मेमोरी लीक कहां है। मेमोरी प्रोफाइलर इंगित करता है कि निजी ढेर बहुत बड़ा है, और स्मृति नीचे की तरह कुछ है (संख्या असली नहीं है, मैं जो दिखाना चाहता हूं वह है जीसी 0 और जीसी 2 के छेद बहुत विशाल हैं, डेटा का आकार सामान्य है):जीसी छेद क्या हैं?

Managed heaps - 1,500,000KB 
      Normal heap - 1400,000KB 
       Generation #0 - 600,000KB 
        Data - 100,000KB 
        "Holes" - 500,000KB 
       Generation #1 - xxKB 
        Data - 0KB 
        "Holes" - xKB 
       Generation #2 - xxxxxxxxxxxxxKB 
        Data - 100,000KB 
        "Holes" - 700,000KB 
      Large heap - 131072KB 
       Large heap - 83KB 
       Overhead/unused - 130989KB 
      Overhead - 0KB 

हाउवर, जीसी छेद क्या है? DotNet मेमोरी प्रोफाइलर के documention निश्चित "छेद":

"छेद" याद है कि दो आवंटित उदाहरणों के बीच अप्रयुक्त है प्रतिनिधित्व करते हैं। कचरा कलेक्टर में पिन किए गए उदाहरण या अनुकूलन के कारण, "छेद" प्रकट होता है जब ढेर पूरी तरह से कॉम्पैक्ट नहीं होता है।

क्या मैं जानना चाहता हूँ है:

  1. "छेद" दो आवंटित उदाहरणों में से किस तरह के बीच दिखाई देते हैं?
  2. किस तरह के उदाहरण पिन किए गए हैं?
  3. ढेर कैसे कॉम्पैक्ट करें?

मुझे उम्मीद है कि कोई इसे समझा सकता है।

+2

मुझे संदेह है कि आलेख एक अलग प्रकार के छेद के बारे में है। – CodesInChaos

+4

"" छेद "स्मृति आवंटित करता है जो दो आवंटित उदाहरणों के बीच उपयोग नहीं किया जाता है। कचरा कलेक्टर में पिन किए गए उदाहरण या अनुकूलन के कारण," छेद "तब दिखाई देता है जब ढेर पूरी तरह से कॉम्पैक्ट नहीं होता है।" [.NET मेमोरी प्रोफाइलर दस्तावेज़ीकरण से] (http://memprofiler.com/onlinedocs/default.htm?turl=managedheaps.htm) – CodesInChaos

+2

इतने सारे लोग इस सवाल को ऊपर क्यों उठा रहे हैं? लेखक का सवाल स्पष्ट नहीं है। संपादन के आधार पर यह भी प्रकट होता है कि उसे पता नहीं है कि वह किस बारे में बात कर रहा है। –

उत्तर

4

pinned object वह है जिसे स्मृति में स्थानांतरित करने की अनुमति नहीं है। अप्रबंधित कोड के साथ काम करते समय अक्सर इसकी आवश्यकता होती है, जिसके लिए आपको स्मृति में कुछ संरचनाओं के लिए एक पॉइंटर में प्रवेश करना पड़ता है - डिफ़ॉल्ट रूप से कचरा कलेक्टर स्मृति को सर्वोत्तम प्रबंधन के लिए उस संरचना को स्थानांतरित करने के लिए स्वतंत्र होता है, हालांकि यदि यह ऐसा होता है, मैंने कुछ अप्रबंधित कोड को उस संरचना के लिए एक सूचक दिया है, तो यदि यह स्थानांतरित हो गया है कि अप्रबंधित कोड सही संरचना पर इंगित नहीं करेगा, तो अप्रत्याशित व्यवहार की ओर अग्रसर होगा।

समाधान उस वस्तु को "पिन" करना है ताकि जीसी को यह बताने के लिए कि इसे स्थानांतरित नहीं किया जाना चाहिए।

आप ढेर को स्पष्ट रूप से कॉम्पैक्ट नहीं कर सकते हैं, जीसी को पूर्ण या आंशिक संग्रह (LOH के अपवाद के साथ) करते समय ऐसा करना चाहिए - बहुत सारी वस्तुओं को पिन करना इसे सफलतापूर्वक प्रबंधित करने के लिए कठिन होगा तथापि। जीसी पर अधिक जानकारी के लिए Garbage Collector Basics and Performance Hints

+1

यह ध्यान देने योग्य है कि नेटवर्क कनेक्शन आम तौर पर उग्र संसाधन होते हैं - इसलिए यदि प्रश्नकर्ता का "टीसीपी कनेक्शन सॉकेट सर्वर" अपने कन्फेक्शन को बहुत सावधानी से प्रबंधित नहीं करता है, और बड़ी संख्या में कनेक्शन प्रबंधित कर रहा है, तो यह बड़ी संख्या में हो सकता है पिन की गई वस्तुओं। –

+0

उपयोग के बाद सभी सॉकेट बंद कर रहे हैं। मुझे लगता है कि कुछ अन्य अप्रबंधित संसाधन आवंटित किए गए हैं और उनका निपटारा नहीं किया गया है। – tianyi

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