2011-12-20 11 views
8

दिन के दौरान मैं अपने विंडोज़ सेवा में जनरल 2 संग्रह का एक बहुत देखते हैं।जीसी पीढ़ी 2 एकत्र करने का फैसला कब करता है?

जीसी केवल Gen1 और Gen0 या केवल Gen0 एकत्र करने के बजाय पूर्ण संग्रह करने का निर्णय लेता है?

+0

शायद कुछ स्मृति को मुक्त करने के लिए दबाव महसूस होने पर शायद। और शायद जब सिस्टम निष्क्रिय है। बस अनुमान लगाओ '। –

उत्तर

9

पढ़ें http://msdn.microsoft.com/en-us/library/0xy59wtx.aspx और अधिक जानकारी के लिए लिंक किए गए लेखों। आम तौर पर, जब आवश्यक हो तो जीन 2 एकत्र किया जाता है। "

एक बात है कि अत्यधिक जेन 2 संग्रह का कारण बन सकती बड़ी वस्तु ढेर (LOH) है। जब LOH भर जाता है, तो यह एक पूर्ण संग्रह ट्रिगर करेगा। यदि आपका आवेदन आवंटित करता है और बहुत सारी बड़ी वस्तुओं (80 के या बड़े) को मुक्त करता है, तो यह आपकी समस्या बहुत अच्छी तरह से हो सकता है।

CLR Inside Out: Large Object Heap Uncovered देखें।

इसके अलावा अपने सेवा में सर्वर कचरा कलेक्टर प्रयोग करने पर विचार। यह आमतौर पर बेहतर प्रदर्शन (कम संग्रह) प्रदान करेगा। इसे अपनी ऐप.कॉन्फिग फ़ाइल में जोड़ें:

<configuration 
    <runtime> 
     <gcServer enabled="true"/> 
    </runtime> 
</configuration> 
+0

हमारी सेवा जांचती है कि क्या करने के लिए काम है और थ्रेडपूल में कतार है। मुझे लगता है कि उन थ्रेडपूल थ्रेड केवल एक ही हैं जो Gen2 तक जाते हैं। हम बड़ी वस्तुओं को आवंटित नहीं करते हैं। लेकिन जब सिस्टम मेमोरी कम होती है तो मैं Gen2 संग्रह देखता हूं। जब आप मल्टीकोर सीपीयू का उपयोग करते हैं तो AFAIK सर्वर मोड डिफ़ॉल्ट है। –

+0

@Peri यदि आप सिस्टम मेमोरी कम है तो यह एक पूर्ण जीसी ट्रिगर करेगा। सिस्टम को वापस अंतरिक्ष की जरूरत है! आप अधिक रैम जोड़ने की संभावना को देखना चाहेंगे। – Joe

+2

@Peri: नहीं, सर्वर मोड डिफ़ॉल्ट नहीं है। जब आप मल्टीकोर का उपयोग करते हैं तो समवर्ती जीसी डिफ़ॉल्ट होता है, लेकिन यह अभी भी क्लाइंट जीसी है। यदि आप सर्वर जीसी चाहते हैं, तो आपको अपनी app.config फ़ाइल में ऐसा कहना होगा। साथ ही, क्या आप वाकई बड़ी वस्तुओं को आवंटित नहीं करते हैं? 64-बिट सिस्टम पर, इसमें केवल 10,000 आइटम वाली एक सूची के लिए 80 किलोबाइट से अधिक बैकिंग सरणी की आवश्यकता होगी। –

5

आम तौर पर एक colletion (किसी भी पीढ़ी के तहत) जब निम्न में से 1 पूरा किया जाता है

  • आवंटन सीमा से अधिक है शुरू हो रहा है। मुझे लगता है कि वर्तमान जरूरतों के आधार पर यह गतिशील है। क्या कोई पुष्टि/अस्वीकार कर सकता है?
  • एक कम स्मृति स्थिति
  • यह GC.Collect के माध्यम से कहा जाता है()

एक और परिदृश्य मुझे याद आ रही हो सकता है नहीं है, लेकिन आम तौर पर यह है कि यह है। पहले एक क्या एक संग्रह बंद आम तौर पर किक, और conisdering यह है G0 से G2 इकट्ठा करने के लिए (अपेक्षाकृत) और अधिक महंगी आप उनमें से कम देखते हैं।


टिप्पणी में प्रश्न को हल करने के लिए:
हर पीढी एक सीमा है कि जब हिट एक संग्रह को ट्रिगर किया जाएगा है। Gen0 5mb हो सकता है, और जब भर जाता है तो ट्रिगर किया जाएगा। जीसी रन के बाद, यदि आप अभी भी में 5 एमबी है, तो मुझे विश्वास है कि यह सीमा बढ़ाएगा। यदि यह प्रत्येक आवंटन से अधिक नहीं होता है तो संग्रह संग्रहित होगा, और आपके पास कोई समस्या है। जेन 2 20MB (ध्यान दें मैं यहाँ संख्या को बनाने रहा हूँ) हो सकता है और एक ही तर्क वहाँ लागू होता है।

एक पाठ्यपुस्तक उदाहरण के लिए, एक साधारण परिदृश्य को देखो।

  1. नए एप्लिकेशन आवंटित वस्तुओं और सभी डेटा की 3MB के लिए कुल Gen0 पर रखा जाता है। (यह हमेशा मामला नहीं है, लेकिन यह दिखाता है कि यह है)
  2. एक जीसी हिट, और इसका 1 एमबी जी 1 में स्थानांतरित हो गया है, बाकी साफ हो गया है।
  3. G0 अब नि: शुल्क है, और G1 उस में 1 एमबी है।
  4. अधिक ऑब्जेक्ट का निर्माण होगा, और अधिक जीसी के होता है। कुछ समय बाद जी 1 भरा हो गया, और कुछ जी 2 में चले गए।
  5. वस्तुओं वहाँ रहना जब तक G2 भरा हुआ है, और फिर वे अगर उपयोग में नहीं साफ किया जाता है। एक वस्तु अभी भी संदर्भित किया जा रहा है, तो यह जब तक यह साफ किया जा सकता G2 में रहेंगे।

एक पूर्ण जीसी महंगा है, और मैंने बिना किसी घटना के दिन देखा है। यह माना जाता है कि यह 64 जीबी रैम के साथ एक सिस्टम पर था, और इसके लिए कोई आवश्यकता नहीं थी।

+0

पहली बात में आपका क्या मतलब है? उदाहरण के लिए जब मैं <5 एमबी आवंटित करता हूं तो यह केवल Gen0 (प्रत्येक आवंटन पर) एकत्र करता है, जेन 1 जब मैं 5-10 एमबी आवंटित करता हूं और Gen2 जब मैं 10 एमबी आवंटित करता हूं? –

+0

मुझे यकीन नहीं है कि मैं उदाहरण समझता हूं। मुझे लगता है कि जब पीढ़ी 'पूर्ण' होती है तो वे जीसी (अभी भी जीवित) नहीं रहते हैं, जब वे पुरानी पीढ़ियों तक वस्तुओं को स्थानांतरित कर देते हैं। –

+0

सही, जब कोई जीसी होता है तो कुंजी होती है, और "पूर्ण" होने से इसे बंद कर दिया जाएगा (या ऊपर दिए गए अन्य 2 कारणों में से एक)। मैं बस इसे एक उदाहरण के रूप में उपयोग कर रहा था। – Joe

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