2010-04-06 15 views
27

मैंने पढ़ा है कि .NET फ्रेमवर्क 4 के साथ वर्तमान कचरा संग्रहण कार्यान्वयन बदल जाएगी:पृष्ठभूमि और समवर्ती कचरा संग्रह के बीच अंतर?

.NET फ्रेमवर्क 4 पृष्ठभूमि कचरा संग्रहण प्रदान करता है। यह सुविधा पिछले संस्करणों में समवर्ती कचरा संग्रह और बेहतर प्रदर्शन प्रदान करता है।

this page पर एक स्पष्टीकरण है कि यह कैसे काम करता है लेकिन मुझे यकीन नहीं है कि मैं इसे समझ गया हूं।

व्यावहारिक दुनिया में आवेदन इस नए जीसी कार्यान्वयन का लाभ क्या है? क्या यह एक ऐसी सुविधा है जिसका उपयोग 3.5 या पिछले 4.0 से संक्रमण के लिए धक्का देने के लिए किया जा सकता है?

उत्तर

75

यहां, माइक्रोसॉफ्ट जीई के दो संस्करणों का वर्णन करने के लिए "समवर्ती" और "पृष्ठभूमि" नामों का उपयोग करता है जो इसे .NET में उपयोग करता है। .NET दुनिया में, "पृष्ठभूमि कलेक्टर" "समवर्ती संग्राहक" पर एक वृद्धि है जिसमें कलेक्टर चल रहा है, इसके दौरान एप्लिकेशन थ्रेड क्या कर सकते हैं पर कम प्रतिबंध हैं।

एक मूल जीसी एक "स्टॉप-द-वर्ल्ड" रणनीति का उपयोग करता है: आवेदक धागे एक सामान्य ढेर से मेमोरी ब्लॉक आवंटित करते हैं। जब जीसी को चलाना चाहिए (उदा। बहुत सारे ब्लॉक आवंटित किए गए हैं, कुछ सफाई की आवश्यकता है), सभी आवेदक (प्रबंधित) धागे रुकते हैं। आखिरी रोकथाम धागा जीसी चलाता है, और जब यह खत्म हो जाता है तो सभी अन्य धागे को अनब्लॉक करता है। एक स्टॉप-द-वर्ल्ड जीसी लागू करने के लिए आसान है लेकिन ऐसे विरामों को प्रेरित करता है जो उपयोगकर्ता स्तर पर अवधारणात्मक हो सकते हैं।

माइक्रोसॉफ्ट का "समवर्ती जीसी" पीढ़ी है: यह ढेर के केवल सीमित हिस्से के लिए स्टॉप-द-वर्ल्ड रणनीति का उपयोग करता है (जिसे वे "पीढ़ी 0 और 1" कहते हैं)। चूंकि वह हिस्सा छोटा रहता है, इसलिए विराम कम रहता है (उदा। 50ms से नीचे), ताकि उपयोगकर्ता उन्हें नोटिस न करे। बाकी ढेर को एक समर्पित जीसी थ्रेड के साथ एकत्र किया जाता है, जो आवेदक धागे (इसलिए नाम) के साथ समवर्ती चला सकता है।

समवर्ती जीसी में कुछ सीमाएं हैं। अर्थात्, ऐसे क्षण हैं जब जीसी थ्रेड को ढेर के कुछ विशेष नियंत्रण को मानना ​​चाहिए। ऐसे समय के दौरान, आवेदक धागे केवल छोटे धागे-विशिष्ट क्षेत्रों से ब्लॉक आवंटित कर सकते हैं। थ्रेड जो बड़ी जरूरतें हैं, जल्द ही मुख्य ढेर पर ठोकर खाएंगे, जो उस समय, जीसी थ्रेड द्वारा बंद कर दिया गया है। आवंटित थ्रेड तब तक अवरुद्ध होना चाहिए जब तक कि जीसी थ्रेड ने लॉक-द-हेप चरण समाप्त नहीं किया हो। यह फिर से विराम उत्पन्न करता है। एक स्टॉप-द-वर्ल्ड जीसी के मुकाबले कम विराम, और ये विराम सभी धागे को प्रभावित नहीं करते हैं। फिर भी रोकता है।

"पृष्ठभूमि जीसी" एक उन्नत जीसी है जिसमें जीसी थ्रेड को ढेर को लॉक करने की आवश्यकता नहीं है। यह पिछले पैराग्राफ में वर्णित अतिरिक्त विराम को हटा देता है; युवा पीढ़ियों को एकत्रित करते समय केवल सीमित विराम बने रहें (माइक्रोसॉफ्ट क्या कहता है "एक अग्रभूमि संग्रह")।

नोट: समवर्ती जीसी और पृष्ठभूमि जीसी के साथ "छिपी लागत" हैं। इन जीसी के लिए सही तरीके से काम करने के लिए, आवेदक धागे से मेमोरी एक्सेस कुछ बहुत ही विशिष्ट तरीकों से किया जाना चाहिए, जिन पर प्रदर्शन पर थोड़ा असर पड़ता है। इसके अलावा, जीसी थ्रेड कैश मेमोरी पर प्रतिकूल प्रभाव डाल सकता है, इस प्रकार अप्रत्यक्ष रूप से खराब प्रदर्शन। उपयोगकर्ता इंटरैक्शन की आवश्यकता के बिना पूरी तरह से कम्प्यूटेशनल कार्य के लिए, औसत पर, कुछ हद तक बेहतर प्रदर्शन प्रदान करता है (उदाहरण के लिए बीस घंटे लंबी गणना उन्नीस घंटों में पूरी हो जाएगी)। लेकिन यह एक बढ़त मामला है, और ज्यादातर स्थितियों में समवर्ती और पृष्ठभूमि जीसी बेहतर हैं।

+0

अच्छी व्याख्या .. हालांकि यदि आप मुख्यधारा की शब्दावली से चिपके रहते हैं तो यह अधिक उपयुक्त होगा। प्रबंधित धागे/कोड आदि आवेदक? वह क्या है? –

+8

आवेदक धागे धागे हैं जो प्रोग्रामर लिखते हैं (छुपे हुए प्रबंधन धागे के विपरीत, यदि कोई हैं तो) चलाते हैं। "प्रबंधित" धागे थ्रेड हैं जो प्रबंधित कोड चलाते हैं (यानी कोड नहीं जो सी या सी ++ में लिखा गया है)। यह _is_ मुख्यधारा की शब्दावली। –

1

कचरा संग्रह के कारण प्राथमिक लाभ कम आवेदन फ्रीज होगा, जिसे स्वयं में एक महत्वपूर्ण सुधार माना जा सकता है। अधिकांश ऐप्स के लिए यह अंतर तब तक ध्यान देने योग्य नहीं होगा जब तक आपके पास स्मृति में बड़ी संख्या में लंबे समय तक रहने वाली वस्तुएं न हों।

यह परिवर्तन समय-संवेदनशील ऐप्स बनाने के लिए .NET को थोड़ा अधिक व्यवहार्य बनाता है (जहां प्रतिक्रिया समय महत्वपूर्ण हैं)। चरम उदाहरण कार एयरबैग हैं - आप नहीं चाहते हैं कि आपका सॉफ़्टवेयर कचरा संग्रह करने में व्यस्त हो, जब उन्हें फुलाया जाना चाहिए। 4.0 में परिवर्तन जीसीइंग के कारण फ्रीज की संख्या और लंबाई को कम करता है लेकिन उन्हें पूरी तरह से हटा नहीं देता है।

8

यहाँ कलंक और आत्म महत्व की overinflated भावना के बिना वास्तविक दुनिया स्पष्टीकरण है:

समवर्ती जीसी में आप एक जीसी में जबकि आवंटित करने के लिए अनुमति दी गई है, लेकिन आप नहीं एक और जीसी शुरू करने के लिए अनुमति नहीं है जबकि एक जीसी में। बदले में इसका मतलब है कि जीसी में आवंटित करने की अधिकतम अनुमति आपको पर एक सेगमेंट (वर्कस्टेशन मोड में वर्तमान में 16 एमबी) से कम है, जो कुछ भी पहले से आवंटित है) से कम है।

पृष्ठभूमि मोड में अंतर (जनरल 0 + 1) एक पूरी पृष्ठभूमि जीसी में जबकि यह है कि आप अनुमति दी जाती है एक नया जीसी शुरू करने के लिए है, और इस आप भले ही में आवंटित करने के लिए एक नया सेगमेंट बनाने की अनुमति देता ज़रूरी। संक्षेप में, अवरोध जो आपके द्वारा एक सेगमेंट में आवंटित किए जाने से पहले हो सकता है, अब और नहीं होगा।

टेस दा मैन से! http://blogs.msdn.com/b/tess/archive/2009/05/29/background-garbage-collection-in-clr-4-0.aspx

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