एक कचरा संग्रहकर्ता (जीसी) एक स्मृति प्रबंधक है। कई प्रोग्रामिंग भाषाओं में एक अंतर्निहित जीसी होता है। यह सुविधा स्वचालित रूप से एक प्रोग्राम में मेमोरी को आवंटित और हटा देती है। यह बंधी हुई, अप्रयुक्त मेमोरी को रिलीज़ करता है जो आपके एप्लिकेशन को धीमा कर देती है।
जीसी की खूबी यह है कि यह आपकी ओर से मेमोरी जारी करता है, आपको कुछ भी करने की आवश्यकता नहीं है। इसलिए, आप इसे एक ऐसी आवश्यक विशेषता मान सकते हैं, जिसकी आप प्रत्येक प्रोग्रामिंग भाषा से अपेक्षा करते हैं। अफसोस की बात है, यह मामला ही नहीं है; सी जैसी लोकप्रिय भाषा में भी जीसी की कमी हो सकती है।
मेमोरी आवंटन कैसे काम करता है?
जब आप किसी प्रोग्रामिंग भाषा में प्रोग्राम चलाते हैं, तो आपका ऑपरेटिंग सिस्टम सुरक्षित रखता है मेमोरी में डेटा स्टैक उस कार्यक्रम के लिए। यह प्रोग्राम निष्पादन पूरा होने तक इस डेटा स्टैक का मालिक है और उस पर कब्जा रखता है। यदि आपके प्रोग्राम को उपलब्ध मेमोरी से अधिक मेमोरी की आवश्यकता है, तो यह ऑपरेटिंग सिस्टम के मेमोरी हीप से गतिशील रूप से अधिक मेमोरी आवंटित कर सकता है।
प्रोग्रामिंग में, एक चर एक स्मृति स्थान का प्रतिनिधित्व करता है। इसलिए, जब आप एक नया चर घोषित करते हैं, तो प्रोग्रामिंग भाषा इस चर के लिए स्मृति में स्थान आवंटित करती है। वेरिएबल का अब एक मेमोरी एड्रेस होगा। जब तक आप इस वेरिएबल के लिए कोई मान निर्दिष्ट नहीं करते हैं, यह अप्रारंभीकृत रहेगा, और इसमें कुछ कचरा मान हो सकता है।
यदि कोई प्रोग्रामिंग भाषा आपको किसी वैरिएबल को इनिशियलाइज़ किए बिना घोषित करने की अनुमति देती है, तो यह एक डायनामिक वैरिएबल है। इसका मतलब है कि आप वैरिएबल को जो मान असाइन करते हैं वह समय के साथ बदल सकता है। हालांकि, वेरिएबल की मेमोरी लोकेशन तब तक बनी रहेगी जब तक कि आप उसे डीलोकेट नहीं कर देते।
मेमोरी डीललोकेशन कैसे काम करता है?
मेमोरी आवंटन सभी प्रोग्रामिंग भाषाओं के लिए एक समान प्रक्रिया है। लेकिन मेमोरी डीलोकेशन की संबंधित विधि अलग-अलग होती है। मेमोरी डीलोकेशन विधियाँ दो प्रकार की होती हैं; मैनुअल और स्वचालित। एक जीसी स्वचालित डीलोकेशन करता है।
एक कचरा कलेक्टर के बिना मेमोरी डीललोकेशन
सी प्रोग्रामिंग भाषा मेमोरी डीलोकेशन के लिए जीसी का उपयोग नहीं करता है। इसलिए, सी प्रोग्रामर को मेमोरी को मैन्युअल रूप से आवंटित और डिलीकेट करना होगा। सी गतिशील स्मृति आवंटन की अनुमति देता है जब आप नहीं जानते कि संकलन समय पर, आप रन टाइम पर कितनी मेमोरी का उपयोग करेंगे।
मानक पुस्तकालय (stdlib.h) में वे कार्य होते हैं जिनका उपयोग C गतिशील स्मृति आवंटन को प्रबंधित करने के लिए करता है। इन कार्यों में शामिल हैं:
- malloc (): मेमोरी का एक विशिष्ट आकार आवंटित करता है और उस मेमोरी में एक पॉइंटर लौटाता है। यदि ऑपरेटिंग सिस्टम मेमोरी पूल में अपर्याप्त मेमोरी उपलब्ध है, तो यह शून्य हो जाता है।
- फ्री (): मेमोरी के एक विशिष्ट ब्लॉक को हटाता है और इसे ऑपरेटिंग सिस्टम मेमोरी पूल में लौटाता है।
सी कार्यक्रम उदाहरण
#शामिल
#शामिलपूर्णांकमुख्य()
{
पूर्णांक *पीटीआर; // पॉइंटर घोषित करें
पूर्णांक जे; // काउंटर घोषित करें// 200 पूर्णांकों के लिए स्थान आवंटित करें
पीटीआर = (पूर्णांक *) मॉलोक(200 * का आकार(पूर्णांक));// आवंटित मेमोरी में पूर्णांक मान डालें
// और प्रत्येक मान को कंसोल पर प्रिंट करें
के लिये (जे = 0; जे < 200; जे++)
{
पीटीआर [जे] = जे;
printf("%d\t",ptr[j]);
}
// पहले से आवंटित मेमोरी को हटा दें
नि: शुल्क(पीटीआर);
वापसी0;
}
उपरोक्त कोड का उपयोग करके 200 पूर्णांक मानों को संग्रहीत करने के लिए स्मृति आवंटित करता है मॉलोक () समारोह। यह इस मेमोरी लोकेशन तक पहुंचने के लिए एक पॉइंटर का उपयोग करता है और इसमें 200 पूर्णांक मान संग्रहीत करता है। पॉइंटर मेमोरी लोकेशन पर स्टोर किए गए डेटा को कंसोल पर प्रिंट भी करता है। अंत में, प्रोग्राम का उपयोग करके पहले से आवंटित मेमोरी को हटा देता है नि: शुल्क() समारोह।
एक कचरा कलेक्टर के साथ मेमोरी डीललोकेशन
कई लोकप्रिय प्रोग्रामिंग भाषाएं स्मृति प्रबंधन के लिए जीसी का उपयोग करती हैं। इससे प्रोग्रामर का जीवन आसान हो जाता है जो इन भाषाओं का उपयोग करते हैं। सी # और जावा दो प्रोग्रामिंग भाषाएं हैं जो जीसी का उपयोग करती हैं।
सी # जीसी
में सी # प्रोग्रामिंग भाषा, एक GC मेमोरी पतों के आवंटन और डीलोकेशन का प्रबंधन करता है। इसलिए, एक सी # प्रोग्रामर को अपने उद्देश्य को पूरा करने के बाद किसी ऑब्जेक्ट को हटाने के बारे में चिंता करने की आवश्यकता नहीं है।
सी # जीसी प्रत्येक नई प्रक्रिया (या प्रोग्राम) के लिए प्रबंधित ढेर नामक मेमोरी पूल को प्रारंभ करता है। यह कॉल करता है वर्चुअलअलोक () स्मृति आवंटित करने के लिए कार्य करता है और वर्चुअलफ्री () इसे हटाने का कार्य करता है। सबसे अच्छी बात यह है कि यह सब पृष्ठभूमि में होता है, आपको प्रोग्रामर से किसी प्रयास की आवश्यकता नहीं होती है।
सी # जीसी में एक अनुकूलन इंजन है, जो यह तय करने के लिए उपयोग करता है कि स्मृति को कब हटाना है। ऑप्टिमाइज़िंग इंजन यह निर्धारित करने के लिए एप्लिकेशन रूट की जांच करता है कि कौन से ऑब्जेक्ट अब उपयोग में नहीं हैं। यह एक ग्राफ बनाकर ऐसा करता है जो एप्लिकेशन की जड़ से जुड़ी हुई वस्तुओं तक फैला हुआ है। इस रूट में स्थिर क्षेत्र, स्थानीय चर आदि शामिल हैं। एप्लिकेशन रूट से जुड़ी कोई भी वस्तु कचरा नहीं है।
GC ऑप्टिमाइज़िंग इंजन केवल मेमोरी को अपने आप एकत्रित नहीं करता है। पहले एक नया स्मृति आवंटन अनुरोध होना चाहिए। यदि सिस्टम में कम मात्रा में उपलब्ध मेमोरी है, तो GC ऑप्टिमाइज़िंग इंजन चलन में आ जाएगा।
जावा जीसी
जावा में, एक जीसी मेमोरी एड्रेस के आवंटन और डीलोकेशन का प्रबंधन भी करता है। हालाँकि, जावा में वर्तमान में चार अलग-अलग प्रकार के समर्थित कचरा संग्रहकर्ता हैं:
- कचरा-प्रथम (G1)
- धारावाहिक
- समानांतर
- जेड कचरा कलेक्टर (जेडजीसी)
जावा डेवलपमेंट किट (JDK) 9 के जारी होने के बाद से G1 कचरा संग्रहकर्ता जावा का डिफ़ॉल्ट GC है। जावा वस्तुओं में डेटा व्यवस्थित करता है और इन वस्तुओं को एक निश्चित आकार के ढेर में संग्रहीत करता है। G1 कचरा संग्रहकर्ता हीप को समान आकार के हीप क्षेत्रों में विभाजित करता है। इसके बाद उसने इन ढेर क्षेत्रों को दो खंडों में विभाजित कर दिया; युवा और पुरानी पीढ़ी।
हर बार जब आप कोई नई वस्तु बनाते हैं, तो इस वस्तु के लिए स्थान आवंटन युवा पीढ़ी में होता है। उम्र बढ़ने की प्रक्रिया का उपयोग करते हुए, G1 कचरा संग्रहकर्ता युवा क्षेत्रों में पुराने क्षेत्रों में वस्तुओं की प्रतिलिपि बनाता है। यह उन वस्तुओं की भी प्रतिलिपि बनाता है जो पुराने क्षेत्र में पहले से ही पुराने क्षेत्र में हैं।
G1 कचरा संग्रहकर्ता तब युवा पीढ़ी में अपनी अधिकांश मेमोरी डीलोकेशन करता है, कभी-कभी पुरानी पीढ़ी के खंड में जाता है।
कचरा संग्रहकर्ता होने के क्या लाभ हैं?
कचरा संग्रहकर्ता होने का लाभ यह है कि यह आपको अपना कोड लिखते समय स्मृति प्रबंधन के बारे में सोचने से रोकता है। इससे आपको अपने आवेदन के अन्य महत्वपूर्ण पहलुओं पर ध्यान केंद्रित करने का समय मिलता है। हालांकि, कई अन्य लाभ हाइलाइट करने लायक हैं।
अप्रयुक्त वस्तुओं को पुनः प्राप्त करना और स्मृति को मुक्त करना क्लीनर एप्लिकेशन निष्पादन प्रदान करता है। यदि आपका प्रोग्राम जितनी जल्दी हो सके स्मृति को मुक्त करता है, तो इसमें एक छोटा स्मृति पदचिह्न होगा और यह अधिक कुशलता से चल सकता है।
कचरा संग्रहण मेमोरी प्रबंधन से संबंधित त्रुटियों जैसे लीक और पॉइंटर त्रुटियों को कम करता है। ऐसा इसलिए है क्योंकि प्रक्रिया अब प्रोग्रामर और सटीक कोड लिखने की उनकी क्षमता पर निर्भर नहीं है।