2011-02-23 17 views
22

मुझे लगता है कि कचरा संग्रह तेजी से रुकने के लिए दोनों (पीढ़ी और वृद्धिशील) अलग-अलग दृष्टिकोण हैं। लेकिन पीढ़ी और वृद्धिशील के बीच मतभेद क्या हैं? वो कैसे काम करते है? और कौन सा वास्तविक समय सॉफ्टवेयर के लिए बेहतर है/कम लंबे विराम पैदा करता है?पीढ़ी और वृद्धिशील कचरा संग्रह के बीच क्या अंतर है?

इसके अलावा, बोहेम जीसी उनमें से कोई भी है?

उत्तर

20

एक पीढ़ी जीसी हमेशा वृद्धिशील है, क्योंकि यह चक्र के दौरान सभी पहुंच योग्य वस्तुओं को एकत्र नहीं करता है। इसके विपरीत, एक वृद्धिशील जीसी जरूरी नहीं है कि यह तय करने के लिए कि कौन सी पहुंच योग्य वस्तुओं को एकत्रित किया जाए या नहीं।

एक पीढ़ी जीसी अलग-अलग सेटों में पहुंचने योग्य वस्तुओं को विभाजित करता है, लगभग उनकी आखिरी उपयोग के अनुसार - उनकी उम्र, इसलिए बोलने के लिए। मूल सिद्धांत यह है कि हाल ही में बनाई गई वस्तुओं को जल्दी से पहुंचने योग्य नहीं होगा। तो शुरुआती चरण में 'युवा' वस्तुओं के साथ सेट एकत्र किया जाता है।

एक वृद्धिशील जीसी उपरोक्त पीढ़ी योजना के साथ लागू किया जा सकता है, लेकिन यह तय करने के लिए विभिन्न विधियों को नियोजित किया जा सकता है कि वस्तुओं के किस समूह को साफ़ किया जाना चाहिए।

जीसी विधियों दोनों पर अधिक जानकारी के लिए this wikipedia page और आगे की तरफ देख सकते हैं।

बोहम की वेबसाइट के अनुसार, उनके जीसी वृद्धिशील और पीढ़ीगत है:

कलेक्टर एक निशान स्वीप एल्गोरिथ्म का उपयोग करता। यह ऑपरेटिंग सिस्टम के तहत सही प्रकार के वर्चुअल मेमोरी समर्थन प्रदान करता है जो जेनरेशनल संग्रह प्रदान करता है।

जहां तक ​​एक वास्तविक समय वातावरण का संबंध है, वहाँ कई शैक्षिक अनुसंधान कचरा संग्रहण करने के लिए नए और सरल तरीके वर्णन करते हुए कागजात हैं:

17

एक वृद्धिशील कचरा कलेक्टर के बजाय पूरे संग्रह को चलाने के लिए होने के लिए, किसी भी कचरा-कलेक्टर कि संवर्द्धित चला सकते हैं (जिसका अर्थ है कि यह एक छोटे काम करते हैं, तो कुछ और काम करते हैं, तो कुछ और काम कर सकते हैं) है बिना किसी रुकावट के। यह पुराने स्टॉप-द-वर्ल्ड कचरा कलेक्टरों के विपरीत है जो उदा। ऑब्जेक्ट पर काम करने में सक्षम होने के बिना किसी अन्य कोड के & स्वीप। लेकिन स्पष्ट होने के लिए: क्या एक वृद्धिशील कचरा कलेक्टर वास्तव में समानांतर में समान कोड पर निष्पादित अन्य कोड में चलाता है, जब तक कि यह व्यवधान योग्य नहीं होता है (जिसके लिए इसे गंदे और साफ वस्तुओं के बीच अंतर करना है)।

पीढ़ी कचरा कलेक्टर पुरानी, ​​मध्यम और नई वस्तुओं के बीच अंतर करता है। इसके बाद यह नई वस्तुओं (कीवर्ड "ईडन") पर जीसी की प्रतिलिपि बना सकता है, मध्यम वस्तुओं पर पुरानी वस्तुओं और विभिन्न संभावनाओं (कार्यान्वयन के आधार पर) के लिए & स्वीप करें। कार्यान्वयन के आधार पर वस्तुओं की पीढ़ियों को प्रतिष्ठित किया जाता है या तो क्षेत्र में या झंडे से कब्जा कर लिया जाता है। पीढ़ी जीसी की चुनौती उन वस्तुओं की सूचियां रखना है जो एक पीढ़ी से दूसरी तारीख तक संदर्भित होती हैं।http://en.wikipedia.org/wiki/Boehm_garbage_collector

+0

यह ईडन क्या है? – kingsmasher1

+0

युवा पीढ़ी को अंतरिक्ष और ईडन से अंतरिक्ष में विभाजित किया गया है। आवंटन दोनों अंतरिक्ष और ईडन दोनों में किया जाता है, दोनों अंतरिक्ष और ईडन को संग्रह द्वारा स्थान पर कॉपी किया जाता है; अंतर यह है कि ईडन पूरी तरह से साफ हो गया है। अधिक जानकारी के लिए यहां देखें और ईडन के लिए पृष्ठ खोजें: http://java.sun.com/docs/hotspot/gc1.4.2/faq.html –

3

http://www.memorymanagement.org/glossary/i.html#incremental.garbage.collection

कुछ अनुरेखण कचरा संग्रहण एल्गोरिदम के बीच में रोक सकते हैं एक संग्रह चक्र जबकि mutator जारी है, के साथ समाप्त होने के बिना:

Boem एक वृद्धिशील पीढ़ीगत जीसी के रूप में यहाँ उद्धृत है असंगत डेटा। ऐसे संग्राहक वृद्धिशील रूप से परिचालन कर सकते हैं और एक इंटरैक्टिव सिस्टम में उपयोग के लिए उपयुक्त हैं।

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

http://www.memorymanagement.org/glossary/g.html#generational.garbage.collection

पीढ़ीगत कचरा संग्रहण कचरा संग्रहण का पता लगाने कि पीढ़ीगत परिकल्पना का उपयोग करता है है। वस्तुओं को पीढ़ियों में एकत्रित किया जाता है। नई वस्तुओं को सबसे कम उम्र में या नर्सरी पीढ़ी में आवंटित किया जाता है, और अगर वे जीवित रहते हैं तो पुरानी पीढ़ियों को पदोन्नत किया जाता है। पुरानी पीढ़ियों में ऑब्जेक्ट्स को कम बार निंदा की जाती है, सीपीयू समय बचाती है।

किसी ऑब्जेक्ट के लिए यह एक वस्तु के लिए आम तौर पर दुर्लभ होता है। इसलिए, एक पीढ़ी में वस्तुओं को आमतौर पर छोटी पीढ़ियों में वस्तुओं के कुछ संदर्भ हैं। इसका मतलब है कि पुरानी पीढ़ियों को इकट्ठा करने के दौरान पुराने पीढ़ियों की स्कैनिंग याद किए गए सेट के माध्यम से अधिक कुशलता से की जा सकती है।

कुछ विशुद्ध रूप से कार्यात्मक भाषाओं (यानी, बिना अद्यतन के) में, सभी संदर्भ समय पर पीछे की ओर हैं, इस मामले में याद किए गए सेट अनावश्यक हैं।

बोहेम-डेमर्स-वीज़र में एक वृद्धिशील मोड है जिसे आप GC_enable_incremental पर कॉल करके सक्षम कर सकते हैं। देखें http://www.hpl.hp.com/personal/Hans_Boehm/gc/gcinterface.html

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