"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > GraalVM नेटिव इमेज में मेमोरी प्रबंधन

GraalVM नेटिव इमेज में मेमोरी प्रबंधन

2024-09-12 को प्रकाशित
ब्राउज़ करें:762

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

कचरा संग्रहण

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

स्वचालित मेमोरी प्रबंधन के प्रमुख लाभों में शामिल हैं:

  • मेमोरी लीक की रोकथाम और कुशल मेमोरी उपयोग।
  • सरलीकृत विकास प्रक्रियाएं और उन्नत कार्यक्रम स्थिरता।

स्मृति में "कचरा" की प्रकृति को समझना और पुनः प्राप्त करने योग्य स्थान की पहचान करना आवश्यक है। आगामी अध्यायों में, हम कचरा संग्रहण के मूलभूत सिद्धांतों की खोज से शुरुआत करेंगे।

संदर्भ गणना एल्गोरिदम [जॉर्ज ई. कोलिन्स 1966]

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

निम्नलिखित कोड पर विचार करें:

पहले वैल्यू डेमो के साथ एक स्ट्रिंग बनाएं जो डी द्वारा संदर्भित है (चित्रा 1)।

String d = new String("demo");

Memory Management in GraalVM Native Image

चित्र 1 - एक स्ट्रिंग बनने के बाद

फिर, d को शून्य पर सेट करें। डेमो की संदर्भ संख्या शून्य है. रेफरेंस काउंटिंग एल्गोरिदम में, डेमो के लिए मेमोरी को पुनः प्राप्त किया जाना है (चित्र 2)।

d =null; // Reference count of 'demo' becomes zero, prompting garbage collection.

Memory Management in GraalVM Native Image

चित्रा 2 - जब संदर्भ रद्द कर दिया जाता है

रेफरेंस काउंटिंग एल्गोरिदम प्रोग्राम निष्पादन के दौरान संचालित होता है, स्टॉप-द-वर्ल्ड घटनाओं से बचता है, जो कचरा संग्रहण के लिए प्रोग्राम को अस्थायी रूप से रोक देता है। हालाँकि, इसका प्रमुख दोष सर्कुलर संदर्भों को संभालने में असमर्थता है (चित्र 3)।

उदाहरण के लिए:

public class CircularReferenceDemo {

  public CircularReferenceDemo reference;
  private String name;

  public CircularReferenceDemo(String name) {
    this.name = name;
  }

  public void setReference(CircularReferenceDemo ref) {
    this.reference = ref;
  }

  public static void main(String[] args) {
    CircularReferenceDemo objA = new CircularReferenceDemo("Ref_A");
    CircularReferenceDemo objB = new CircularReferenceDemo("Ref_B");

    objA.setReference(objB);
    objB.setReference(objA);

    objA = null;
    objB = null;
  }
}

यहां, बाहरी संदर्भों को रद्द करने के बावजूद, ओबीजेए और ओबीजेबी के बीच पारस्परिक संदर्भ उनके कचरा संग्रहण को रोकते हैं।

Memory Management in GraalVM Native Image

चित्रा 3 - परिपत्र संदर्भ

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

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

रीचैबिलिटी विश्लेषण एल्गोरिदम [1978]

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

जैसा कि नीचे दी गई छवि में दिखाया गया है, नीले घेरे में मौजूद वस्तुओं को जीवित रखा जाना चाहिए और भूरे घेरे में मौजूद वस्तुओं को पुनर्चक्रित किया जा सकता है (चित्र 4)।

Memory Management in GraalVM Native Image

चित्रा 4 - मेमोरी लीक

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

आम तौर पर, जीसी रूट के रूप में माने जाने वाले जावा ऑब्जेक्ट में शामिल हैं:

  • मौजूदा पद्धति के दायरे में स्थानीय चर।
  • सक्रिय जावा थ्रेड्स।
  • कक्षाओं से स्थैतिक क्षेत्र।
  • मूल कोड से जेएनआई संदर्भ।

GraalVM मूल छवि का अवलोकन

GraalVM एक अग्रिम-समय (AOT) कंपाइलर प्रदान करता है, जो जावा अनुप्रयोगों को स्टैंडअलोन निष्पादन योग्य बायनेरिज़ में अनुवादित करता है जिन्हें GraalVM नेटिव इमेज के रूप में जाना जाता है। Oracle लैब्स द्वारा विकसित, ये बायनेरिज़
एप्लिकेशन और लाइब्रेरी कक्षाओं और जीसी जैसे रनटाइम घटकों को इनकैप्सुलेट करें, जो जावा रनटाइम एनवायरनमेंट (जेआरई) के बिना संचालन की अनुमति देता है।

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

सब्सट्रेट वीएम के बुनियादी सिद्धांत

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

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

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

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

सब्सट्रेट वीएम के उल्लेखनीय तत्वों में शामिल हैं:

  • रॉ मेमोरी ऑपरेशंस के लिए पॉइंटर इंटरफ़ेस पॉइंटर और शब्द-आकार के मानों को संभालने के लिए वर्डबेस इंटरफ़ेस वर्डबेस जैसे इंटरफेस के माध्यम से सरलीकृत मेमोरी एक्सेस।

  • डायनेमिक ऑब्जेक्ट आवंटन के लिए अपरिवर्तनीय ऑब्जेक्ट और रनटाइम सेगमेंट वाले पूर्व-प्रारंभिक खंडों में ढेर का विभाजन (चित्रा 5)।

Memory Management in GraalVM Native Image

चित्रा 5 - मूल छवि में मेमोरी प्रबंधन

रनटाइम के दौरान, सब्सट्रेट वीएम में तथाकथित छवि ढेर में छवि निर्माण प्रक्रिया के दौरान बनाई गई वस्तुएं शामिल होती हैं। हीप का यह खंड निष्पादन योग्य बाइनरी के डेटा अनुभाग से डेटा के साथ पूर्व-प्रारंभिक है और एप्लिकेशन स्टार्टअप पर आसानी से पहुंच योग्य है। छवि ढेर में रहने वाली वस्तुओं को अमर माना जाता है; इसलिए, इन वस्तुओं के संदर्भों को
द्वारा रूट पॉइंटर्स के रूप में माना जाता है मल जमा करना। हालाँकि, GC केवल रूट पॉइंटर्स के लिए छवि ढेर के कुछ हिस्सों को स्कैन करता है, विशेष रूप से वे जिन्हें केवल-पढ़ने के लिए चिह्नित नहीं किया गया है।

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

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

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

ढेर का टुकड़ा

सब्सट्रेट वीएम के हीप मॉडल में, मेमोरी को व्यवस्थित रूप से हीप चंक्स के रूप में ज्ञात संरचनाओं में व्यवस्थित किया जाता है। ये खंड, आमतौर पर डिफ़ॉल्ट रूप से 1024KB आकार के होते हैं, वर्चुअल मेमोरी का एक सतत खंड बनाते हैं जो पूरी तरह से ऑब्जेक्ट स्टोरेज के लिए आवंटित किया जाता है। इन हिस्सों की संगठनात्मक संरचना एक लिंक्ड सूची है जहां पिछला हिस्सा सबसे हाल ही में जोड़े गए सेगमेंट का प्रतिनिधित्व करता है। ऐसा मॉडल
कुशल मेमोरी आवंटन और ऑब्जेक्ट प्रबंधन की सुविधा प्रदान करता है।

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

मूल छवि में कचरा संग्राहक

GraalVM नेटिव इमेज विभिन्न आवश्यकताओं के अनुरूप विभिन्न GCs का समर्थन करता है:

  • सीरियल जीसी: एकल-थ्रेडेड अनुप्रयोगों के लिए उपयुक्त डिफ़ॉल्ट कम-फ़ुटप्रिंट कलेक्टर।

  • G1 कचरा संग्रहकर्ता: बड़े ढेर आकार के साथ बहु-थ्रेडेड अनुप्रयोगों के लिए डिज़ाइन किया गया, जो पीढ़ी प्रबंधन में लचीलेपन को बढ़ाता है।

  • एप्सिलॉन जीसी: एक न्यूनतम संग्राहक जो आवंटन को संभालता है लेकिन पुनर्ग्रहण का अभाव है, अल्पकालिक अनुप्रयोगों के लिए सबसे अच्छा उपयोग किया जाता है जहां पूर्ण ढेर उपयोग अनुमानित है।

निष्कर्ष

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

विज्ञप्ति वक्तव्य यह लेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/yanev/memory-management-in-graalvm-native-image-4nbe?1 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए स्टडी_गोलंग@163.com से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3