CodeGym /Java Course /मॉड्यूल 3 /जेवीएम में मेमोरी

जेवीएम में मेमोरी

मॉड्यूल 3
स्तर 18 , सबक 0
उपलब्ध

जेवीएम में मेमोरी को समझना

जैसा कि आप पहले से ही जानते हैं, जेवीएम अपने भीतर जावा प्रोग्राम चलाता है। किसी भी वर्चुअल मशीन की तरह, इसकी अपनी मेमोरी ऑर्गनाइजेशन सिस्टम है।

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

जेवीएम में मेमोरी को समझना

महत्वपूर्ण! मूल जावा मॉडल काफी अच्छा नहीं था, इसलिए इसे जावा 1.5 में संशोधित किया गया था। इस संस्करण का उपयोग आज तक किया जाता है (जावा 14+)।

थ्रेड स्टैक

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

थ्रेड स्टैक

JVM में चलने वाले सभी थ्रेड्स का अपना स्टैक होता है । स्टैक, बदले में, थ्रेड द्वारा कॉल की जाने वाली विधियों के बारे में जानकारी रखता है। मैं इसे "कॉल स्टैक" कहूंगा। जैसे ही थ्रेड अपना कोड निष्पादित करता है, कॉल स्टैक फिर से शुरू हो जाता है।

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

आदिम प्रकार के सभी स्थानीय चर ( बूलियन , बाइट , शॉर्ट , चार , इंट , लॉन्ग , फ्लोट , डबल ) पूरी तरह से थ्रेड स्टैक पर संग्रहीत होते हैं और अन्य थ्रेड्स के लिए दृश्यमान नहीं होते हैं। एक धागा एक आदिम चर की एक प्रति दूसरे धागे को पारित कर सकता है, लेकिन एक आदिम स्थानीय चर को साझा नहीं कर सकता।

ढेर

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

नीचे एक आरेख है जो कॉल स्टैक और स्थानीय चर (वे ढेर पर संग्रहीत होते हैं) के साथ-साथ वस्तुओं (वे ढेर पर संग्रहीत होते हैं) को दिखाता है:

ढेर

ऐसे मामले में जहां स्थानीय चर एक आदिम प्रकार का होता है, इसे थ्रेड के ढेर पर संग्रहीत किया जाता है।

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

एक वस्तु में विधियाँ होती हैं, इन विधियों में स्थानीय चर होते हैं। इन स्थानीय चरों को थ्रेड स्टैक पर भी संग्रहीत किया जाता है, भले ही वह वस्तु जिसके पास विधि है, वह हीप पर संग्रहीत है।

ऑब्जेक्ट के सदस्य चर ऑब्जेक्ट के साथ ढेर पर संग्रहीत होते हैं। यह सच है जब सदस्य चर एक आदिम प्रकार का होता है और जब यह एक वस्तु संदर्भ होता है।

स्टैटिक क्लास वेरिएबल्स को क्लास डेफिनिशन के साथ हीप पर स्टोर किया जाता है।

वस्तुओं के साथ सहभागिता

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

वस्तुओं के साथ सहभागिता (ढेर)

दो धागों में स्थानीय चर का एक सेट होता है।स्थानीय चर 2ढेर पर एक साझा वस्तु को इंगित करता है (वस्तु 3). प्रत्येक धागे की स्थानीय चर की अपनी प्रति अपने संदर्भ के साथ होती है। उनके संदर्भ स्थानीय चर हैं और इसलिए उन्हें थ्रेड स्टैक पर संग्रहीत किया जाता है। हालाँकि, दो अलग-अलग संदर्भ ढेर पर एक ही वस्तु की ओर इशारा करते हैं।

कृपया ध्यान दें कि जनरलवस्तु 3के लिंक हैंवस्तु 2औरवस्तु 4सदस्य चर के रूप में (तीरों द्वारा दिखाया गया)। इन लिंक्स के जरिए दो थ्रेड्स एक्सेस कर सकते हैंवस्तु 2औरवस्तु4.

आरेख एक स्थानीय चर भी दिखाता है (स्थानीय चर 1विधि दो से )। इसकी प्रत्येक प्रति में अलग-अलग संदर्भ होते हैं जो दो अलग-अलग वस्तुओं की ओर इशारा करते हैं (वस्तु 1औरवस्तु 5) और वही नहीं। सैद्धांतिक रूप से, दोनों धागे दोनों तक पहुंच सकते हैंवस्तु 1, ऐसा करने के लिएवस्तु 5अगर उनके पास इन दोनों वस्तुओं का संदर्भ है। लेकिन ऊपर दिए गए आरेख में, प्रत्येक थ्रेड में केवल दो वस्तुओं में से एक का संदर्भ होता है।

वस्तुओं के साथ बातचीत का एक उदाहरण

आइए देखें कि हम कोड में काम कैसे प्रदर्शित कर सकते हैं:

public class MySomeRunnable implements Runnable() {

    public void run() {
        one();
    }

    public void one() {
        int localOne = 1;

        Shared localTwo = Shared.instance;

        //... do something with local variables

        two();
    }

    public void two() {
        Integer localOne = 2;

        //... do something with local variables
    }
}
public class Shared {

    // store an instance of our object in a variable

    public static final Shared instance = new Shared();

    // member variables pointing to two objects on the heap

    public Integer object2 = new Integer(22);
    public Integer object4 = new Integer(44);
}

रन () विधि एक () विधि को कॉल करती है , और एक () बदले में दो () को कॉल करती है ।

एक () विधि एक आदिम स्थानीय चर घोषित करती है (localOne) प्रकार int और एक स्थानीय चर (localदो), जो किसी वस्तु का संदर्भ है।

one() मेथड को एक्सेक्यूट करने वाला प्रत्येक थ्रेड अपनी कॉपी बनाएगाlocalOneऔरlocalदोआपके ढेर में। चरlocalOneप्रत्येक धागे के ढेर पर होने के कारण एक दूसरे से पूरी तरह से अलग हो जाएंगे। एक थ्रेड यह नहीं देख सकता कि दूसरा थ्रेड उसकी कॉपी में क्या बदलाव करता हैlocalOne.

one() मेथड को एक्सेक्यूट करने वाला प्रत्येक थ्रेड भी अपनी कॉपी बनाता हैlocalदो. हालाँकि, दो अलग-अलग प्रतियाँlocalदोढेर पर एक ही वस्तु की ओर इशारा करते हुए समाप्त करें। तथ्य यह है किlocalदोस्थैतिक चर द्वारा संदर्भित वस्तु की ओर इशारा करता हैउदाहरण. स्थैतिक चर की केवल एक प्रति होती है, और वह प्रति ढेर पर संग्रहीत होती है।

तो दोनों प्रतियाँlocalदोएक ही साझा उदाहरण की ओर इशारा करते हुए समाप्त करें । साझा उदाहरण भी ढेर पर संग्रहीत किया जाता है। यह मिलान करता हैवस्तु 3ऊपर आरेख में।

ध्यान दें कि साझा वर्ग में दो सदस्य चर भी होते हैं। सदस्य चर स्वयं वस्तु के साथ ढेर पर संग्रहीत होते हैं। दो सदस्य चर दो अन्य वस्तुओं की ओर इशारा करते हैंपूर्णांक. ये पूर्णांक वस्तुएं इसके अनुरूप हैंवस्तु 2औरवस्तु 4आरेख पर।

यह भी ध्यान दें कि दो () विधि नाम का एक स्थानीय चर बनाता हैlocalOne. यह स्थानीय चर Integer प्रकार की वस्तु का संदर्भ है । विधि लिंक सेट करती हैlocalOneएक नए पूर्णांक उदाहरण को इंगित करने के लिए । लिंक इसकी कॉपी में स्टोर हो जाएगाlocalOneप्रत्येक धागे के लिए। ढेर पर दो पूर्णांक उदाहरण संग्रहीत किए जाएंगे, और क्योंकि विधि हर बार निष्पादित होने पर एक नई पूर्णांक वस्तु बनाती है, इस विधि को निष्पादित करने वाले दो धागे अलग-अलग पूर्णांक उदाहरण बनाएंगे । उनका मिलान होता हैवस्तु 1औरवस्तु 5ऊपर आरेख में।

इंटीजर प्रकार के साझा वर्ग में दो सदस्य चर पर भी ध्यान दें , जो कि एक आदिम प्रकार है। क्योंकि ये चर सदस्य चर हैं, वे अभी भी ढेर पर वस्तु के साथ संग्रहीत हैं। थ्रेड स्टैक पर केवल स्थानीय चर संग्रहीत किए जाते हैं।

टिप्पणियां
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION