2011-10-02 13 views
16

मैंने कचरा कलेक्टरों को कई चीजों के रूप में लेबल किया है - पीढ़ी, आदि। लेकिन मैंने बोहेम जीसी को "रूढ़िवादी" के रूप में लेबल किया है। पूरी तरह से इसका क्या मतलब है?कंज़र्वेटिव कचरा कलेक्टर

उत्तर

23

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

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

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

+1

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

+0

@supercat इस तरह के सिस्टम के लिए हार्डवेयर समर्थन क्या है? – Pepijn

+0

@Pepijn: मुझे किसी भी मौजूदा हार्डवेयर के बारे में पता नहीं है जो 16,384 ऑब्जेक्ट सीमा को लागू किए बिना ऐसी चीज का समर्थन करेगा (जो आज के मानकों के अनुसार निश्चित रूप से छोटा होगा)। अगर कोई ऑब्जेक्ट उन्मुख ढांचे में प्रदर्शन को अनुकूलित करने के इरादे से अगली पीढ़ी के आर्किटेक्चर को डिजाइन कर रहा था, हालांकि, हार्डवेयर की मामूली मात्रा के लिए कचरा-संग्रह के साथ काफी सहायता प्रदान करना संभव होगा। उदाहरण के लिए, पीढ़ी या समवर्ती कचरा संग्रह में एक महत्वपूर्ण आवश्यकता यह जानना है कि किस वस्तु को संशोधित किया गया है ... – supercat

5

एक रूढ़िवादी कचरा कलेक्टर वह है जो यह नहीं जानता कि दिया गया शब्द एक सूचक है या नहीं। यदि शब्द एक आवंटित ढेर ब्लॉक में इंगित करता है तो कचरा कलेक्टर रूढ़िवादी रूप से मानता है कि शब्द एक सूचक है और इसलिए, उस ढेर ब्लॉक या किसी भी चीज़ से पहुंचने योग्य माना जाता है।

इस दृष्टिकोण का मुख्य लाभ यह है कि यह संकलक के साथ मिलकर काम करने के बिना पहुंचने योग्य मूल्य एकत्र कर सकता है।

  1. मान संकेत पुनर्नवीनीकरण किया जा रहा से ढेर के कुछ हिस्सों रोकने के द्वारा मेमोरी लीक के कारण तरह देखने के लिए होती हैं: हालांकि, वहाँ कई नुकसान कर रहे हैं। 32-बिट एड्रेस रिक्त स्थान के साथ यह एक बड़ी समस्या है क्योंकि जीबी रैम आवंटित होने पर लगभग हर int एक ढेर ब्लॉक को इंगित करेगा।

  2. निर्धारित आवंटित ढेर ब्लॉक में एक शब्द बिंदु निर्धारित करने के लिए ढेर की खोज की आवश्यकता है जो धीमी और (निष्पक्ष) अनावश्यक है।

  3. जीसी ढेर ब्लॉक नहीं ले जा सकता है क्योंकि यह पॉइंटर्स अपडेट नहीं कर सकता क्योंकि यह नहीं जानता कि वे कहां हैं।

  4. कोड जो हेप ब्लॉक के बाहर पॉइंटर्स या उपयोग पॉइंटर्स को छुपाता है, एक रूढ़िवादी जीसी को दुर्घटनाग्रस्त कर देगा। यह समस्या न्यूमेरिकल रेसिपी कोड और बोहेम जीसी के साथ उभरी, यद्यपि एनआर सी कोड ने सी स्पेक का उल्लंघन किया।

ये नुकसान इतने गंभीर हैं कि उत्पादन कचरा कलेक्टर जब भी संभव हो रूढ़िवादी न होने का प्रयास करते हैं।

+1

आपका पॉइंट 2 काफी गलत है। एक उचित डिजाइन किए गए सेटअप में यह निर्धारित करना कि कोई सूचक वैध आवंटन को संबोधित कर रहा है, वह काफी कुशल है। –

+0

@ हॉटिक्स: कार्यान्वयन आम तौर पर अंतराल के पेड़ की खोज करते हैं जो आमतौर पर मार्क चरण के आंतरिक पाश में कई आउट-ऑफ-कैश मेमोरी पढ़ता है। सटीक संग्राहक में खोज न करने की तुलना में यह धीमा है। –

+0

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

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