Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

कचरा संग्रहण का परिचय (भाग II)

रूबी मैजिक की पिछली कड़ी में हमने बात की कि हमें कचरा संग्रह (जीसी) की आवश्यकता क्यों है और यह सामान्य रूप से कैसे काम करता है। इस पोस्ट में हम रूबी में इसे लागू करने के तरीके के बारे में थोड़ा गहराई से जानेंगे।

विभिन्न रूबी कार्यान्वयन

रूबी के कई कार्यान्वयन हैं। तीन लोकप्रिय हैं:MRI (Matz's Ruby Interpreter), Rubinius और JRuby। विभिन्न रूबी कार्यान्वयन जीसी के विभिन्न तरीकों का उपयोग करते हैं। इस लेख में हम एमआरआई पर ध्यान केंद्रित करेंगे, जिसका अधिकांश रूबी डेवलपर्स उपयोग करते हैं।

रूबी का ढेर

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

रूबी वस्तुओं को संग्रहीत करने के लिए यह एक खराब फिट है। ये ऑब्जेक्ट अक्सर एक विधि कॉल से अधिक समय तक चिपके रहते हैं। साथ ही, यह अनुमान लगाना लगभग असंभव है कि कोई वस्तु ढेर के लिए बहुत बड़ी होगी या नहीं।

इसलिए रूबी अन्य प्रकार की स्मृति का उपयोग करती है:ढेर। ढेर पर एक प्रोग्राम कुछ मेमोरी का दावा कर सकता है और फिर उस मेमोरी के साथ सफाई के लिए जिम्मेदार होता है। रूबी इसका उपयोग स्मृति के एक स्लैब को रूबी वस्तुओं को संग्रहीत करने के लिए उपयोग करने का दावा करके करती है। इसे रूबी के ढेर के रूप में जाना जाता है।

ढेर और ढेर सारांश
स्टैक मेमोरी बहुत तेज़
फ़ंक्शन कॉल समाप्त होने पर उपयोग की गई मेमोरी स्वचालित रूप से मुक्त हो जाती है
आकार में बहुत सीमित
हीप मेमोरी स्टैक की तुलना में थोड़ा धीमा
कोई स्वचालित सफाई नहीं
आकार केवल कंप्यूटर की उपलब्ध मेमोरी द्वारा सीमित है

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

चिह्नित करें और स्वीप करें

MRI मार्क और स्वीप नामक GC एल्गोरिथम का उपयोग करता है। यह पहले एक मार्क फेज करके संचालित होता है। मार्क चरण में कचरा कलेक्टर वर्तमान में मौजूद सभी वस्तुओं को स्कैन करता है और प्रत्येक वस्तु पर एक चिह्नित ध्वज सेट करता है जिसे वह मानता है कि साफ किया जा सकता है।

चिह्न चरण आपके कोड के निष्पादन को रोक देता है। इसका कारण यह है कि गारबेज कलेक्टर को मौजूद वस्तुओं के बीच के सभी संबंधों को समझना पड़ता है। यदि प्रोग्राम मार्क प्रक्रिया के दौरान चल रहा होगा तो इस बीच चीजें बदल सकती हैं और कचरा कलेक्टर सुनिश्चित नहीं होगा कि किसी वस्तु की वर्तमान स्थिति क्या है।

दूसरा स्वीप चरण शुरू होता है। यह रूबी 1.9 और ऊपर की पृष्ठभूमि में चलता है। कचरा कलेक्टर चुपचाप हर उस वस्तु को मुक्त कर देता है जिसे चिह्नित चरण में चिह्नित किया गया था। मेमोरी केवल स्वीप के बाद ही फिर से उपलब्ध होती है।

चूंकि मार्क चरण आपके कोड के निष्पादन को रोकता है, यही वह जगह है जहां उत्पादन में समस्याएं हो सकती हैं। स्वीप चरण अपेक्षाकृत सौम्य है।

चिह्नित और स्वीप सारांश
चिह्न चरण मौजूदा ऑब्जेक्ट को स्कैन करता है
अगर ऑब्जेक्ट को साफ़ किया जा सकता है तो मार्क फ़्लैग सेट करता है
कोड निष्पादन को रोकता है
स्वीप चरण पृष्ठभूमि में चलता है
चिह्नित वस्तुओं को साफ करता है
स्वीप प्रतिस्पर्धा के बाद फिर से उपलब्ध स्मृति

मेजर और माइनर GC चलता है

रूबी 2.1+ में कचरा कलेक्टर प्रमुख और मामूली रन करता है। यह ट्रैक करता है कि कौन सी वस्तुएं नई हैं। यदि कोई वस्तु कुछ जीसी चलती है तो उसे पुराना के रूप में चिह्नित किया जाता है। पुरानी वस्तुओं को फिर मामूली रनों में नजरअंदाज कर दिया जाता है। यह नाबालिग को बहुत कम दखल देता है क्योंकि कचरा कलेक्टर को केवल उन वस्तुओं को स्कैन करना होता है जिन्हें अभी आवंटित किया गया है।

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

बड़े और छोटे रन
प्रमुख दौड़ कम बार चलता है
चलाने के लिए अधिक गहन
मामूली दौड़ पुरानी वस्तुओं को अनदेखा करता है
अधिक बार दौड़ता है
चलाने में कम दखल देता है

उनके लिए जो गहरा गोता लगाना चाहते हैं

इसके बारे में हमने अमन गुप्ता के शानदार ब्लॉग से बहुत कुछ सीखा। देखें कि क्या आप इस विषय में गहराई से जाना चाहते हैं।

अगला:व्यावहारिक कचरा संग्रहण ट्यूनिंग

गारबेज कलेक्टर कैसे काम करता है, इसे ट्यून करने के लिए आप कई मीट्रिक्स को माप सकते हैं और कॉन्फ़िगरेशन परिवर्तन कर सकते हैं। इस जीसी श्रृंखला की अगली किस्त में हम इन मीट्रिक और कॉन्फ़िगरेशन पैरामीटर पर चर्चा करेंगे।


  1. रूबी में एक प्रोग्रामिंग भाषा का निर्माण:दुभाषिया, भाग 2

    Github पर पूर्ण स्रोत स्टॉफ़ल प्रोग्रामिंग भाषा का पूर्ण कार्यान्वयन GitHub पर उपलब्ध है। अगर आपको बग मिलते हैं या आपके कोई प्रश्न हैं, तो बेझिझक कोई समस्या खोलें। इस ब्लॉग पोस्ट में, हम स्टॉफ़ल के लिए दुभाषिया को लागू करना जारी रखेंगे, जो पूरी तरह से रूबी में निर्मित एक खिलौना प्रोग्रामिंग भाषा

  1. टीसीमॉलोक के साथ रूबी की मेमोरी आवंटन की रूपरेखा

    रूबी में मेमोरी आवंटन कैसे काम करता है? रूबी को मेमोरी टुकड़ों में मिलती है, जिन्हें पेज कहा जाता है, यहां नई वस्तुएं सहेजी जाती हैं। फिर… जब ये पृष्ठ भर जाते हैं, तो अधिक स्मृति की आवश्यकता होती है। रूबी ऑपरेटिंग सिस्टम से malloc . के साथ अधिक मेमोरी का अनुरोध करती है समारोह। यह malloc फ़ंक्श

  1. रूबी इंटर्नल्स:रूबी ऑब्जेक्ट्स के मेमोरी लेआउट को एक्सप्लोर करना

    क्या आप रूबी इंटर्नल का एक त्वरित दौरा चाहेंगे? फिर आप एक दावत के लिए तैयार हैं। क्योंकि … हम एक साथ यह पता लगाने जा रहे हैं कि रूबी ऑब्जेक्ट को मेमोरी में कैसे रखा जाता है और आप कुछ अच्छी चीजें करने के लिए आंतरिक डेटा संरचनाओं में कैसे हेरफेर कर सकते हैं। अपनी सीट बेल्ट बांधें और रूबी दुभाषिया