JVM मध्ये मेमरी समजून घेणे

तुम्हाला आधीच माहित आहे की, JVM स्वतःमध्ये Java प्रोग्राम चालवते. कोणत्याही आभासी मशीनप्रमाणे, त्याची स्वतःची मेमरी संस्था प्रणाली आहे.

अंतर्गत मेमरी लेआउट तुमचे Java ऍप्लिकेशन कसे कार्य करते हे सूचित करते. अशा प्रकारे, अनुप्रयोग आणि अल्गोरिदमच्या ऑपरेशनमधील अडथळे ओळखले जाऊ शकतात. ते कसे कार्य करते ते पाहूया.

JVM मध्ये मेमरी समजून घेणे

महत्वाचे! मूळ जावा मॉडेल पुरेसे चांगले नव्हते, म्हणून ते Java 1.5 मध्ये सुधारित केले गेले. ही आवृत्ती आजपर्यंत वापरली जाते (Java 14+).

थ्रेड स्टॅक

JVM द्वारे अंतर्गत वापरलेले Java मेमरी मॉडेल मेमरी थ्रेड स्टॅक आणि ढीगांमध्ये विभाजित करते. जावा मेमरी मॉडेल पाहू, तार्किकदृष्ट्या ब्लॉक्समध्ये विभागलेले:

थ्रेड स्टॅक

JVM मध्ये चालणाऱ्या सर्व थ्रेड्सचा स्वतःचा स्टॅक असतो . थ्रेडने कोणत्या पद्धती कॉल केल्या आहेत याची माहिती स्टॅकमध्ये असते. मी याला "कॉल स्टॅक" म्हणेन. थ्रेडने कोड कार्यान्वित केल्यावर कॉल स्टॅक पुन्हा सुरू होतो.

थ्रेडच्या स्टॅकमध्ये थ्रेडच्या स्टॅकवर पद्धती कार्यान्वित करण्यासाठी आवश्यक असलेले सर्व स्थानिक व्हेरिएबल्स असतात. थ्रेड फक्त त्याच्या स्वतःच्या स्टॅकमध्ये प्रवेश करू शकतो. लोकल व्हेरिएबल्स इतर थ्रेड्सना दिसत नाहीत, फक्त ते तयार केलेल्या थ्रेडला. दोन थ्रेड्स समान कोड कार्यान्वित करत आहेत अशा परिस्थितीत, ते दोघे स्वतःचे स्थानिक चल तयार करतात. अशा प्रकारे, प्रत्येक थ्रेडमध्ये प्रत्येक स्थानिक व्हेरिएबलची स्वतःची आवृत्ती असते.

आदिम प्रकारांचे सर्व स्थानिक चल ( बूलियन , बाइट , शॉर्ट , चार , इंट , लाँग , फ्लोट , डबल ) पूर्णपणे थ्रेड स्टॅकवर साठवले जातात आणि इतर थ्रेड्सना दृश्यमान नसतात. एक थ्रेड आदिम व्हेरिएबलची प्रत दुसर्‍या थ्रेडवर पाठवू शकतो, परंतु आदिम स्थानिक चल सामायिक करू शकत नाही.

ढीग

कोणत्या थ्रेडने ऑब्जेक्ट तयार केला याची पर्वा न करता, हीपमध्ये तुमच्या ऍप्लिकेशनमध्ये तयार केलेल्या सर्व ऑब्जेक्ट्स असतात. यामध्ये आदिम प्रकारांचे रॅपर समाविष्ट आहेत (उदाहरणार्थ, बाइट , पूर्णांक , लांब , आणि असेच). ऑब्जेक्ट तयार केला गेला असेल आणि स्थानिक व्हेरिएबलला नियुक्त केला गेला असेल किंवा दुसर्‍या ऑब्जेक्टचे सदस्य व्हेरिएबल म्हणून तयार केले असेल तर काही फरक पडत नाही, तो ढीग वर संग्रहित केला जातो.

खाली एक आकृती आहे जी कॉल स्टॅक आणि स्थानिक व्हेरिएबल्स (ते स्टॅकवर संग्रहित केले जातात) तसेच ऑब्जेक्ट्स (ते ढिगाऱ्यावर संग्रहित केले जातात) दर्शवते:

ढीग

स्थानिक व्हेरिएबल प्रिमिटिव्ह प्रकारातील असेल तर ते थ्रेडच्या स्टॅकवर साठवले जाते.

स्थानिक व्हेरिएबल ऑब्जेक्टचा संदर्भ देखील असू शकतो. या प्रकरणात, संदर्भ (स्थानिक व्हेरिएबल) थ्रेड स्टॅकवर संग्रहित केला जातो, परंतु ऑब्जेक्ट स्वतः ढीगवर संग्रहित केला जातो.

ऑब्जेक्टमध्ये पद्धती असतात, या पद्धतींमध्ये स्थानिक चल असतात. ही स्थानिक व्हेरिएबल्स थ्रेड स्टॅकवर देखील संग्रहित केली जातात, जरी पद्धत मालकीची ऑब्जेक्ट हीपवर संग्रहित केली जाते.

ऑब्जेक्टचे सदस्य व्हेरिएबल्स ऑब्जेक्टसह हीपवर साठवले जातात. जेव्हा सदस्य व्हेरिएबल आदिम प्रकारचा असतो आणि जेव्हा तो ऑब्जेक्ट संदर्भ असतो तेव्हा हे दोन्ही खरे आहे.

स्टॅटिक क्लास व्हेरिएबल्स देखील क्लास व्याख्येसह ढीग वर संग्रहित केले जातात.

वस्तूंशी संवाद

ऑब्जेक्टचा संदर्भ असलेल्या सर्व थ्रेड्सद्वारे हीपवरील ऑब्जेक्ट्समध्ये प्रवेश केला जाऊ शकतो. जर एखाद्या थ्रेडला ऑब्जेक्टमध्ये प्रवेश असेल तर तो ऑब्जेक्टच्या व्हेरिएबल्समध्ये प्रवेश करू शकतो. दोन थ्रेड्स एकाच वेळी एकाच ऑब्जेक्टवर मेथड कॉल करत असल्यास, त्या दोघांना ऑब्जेक्टच्या सदस्य व्हेरिएबल्समध्ये प्रवेश असेल, परंतु प्रत्येक थ्रेडकडे स्थानिक व्हेरिएबल्सची स्वतःची प्रत असेल.

वस्तूंशी संवाद (ढीग)

दोन थ्रेड्समध्ये स्थानिक व्हेरिएबल्सचा संच असतो.स्थानिक चल 2ढिगाऱ्यावरील सामायिक वस्तूकडे निर्देश करते (ऑब्जेक्ट 3). प्रत्येक थ्रेडमध्ये त्याच्या स्वतःच्या संदर्भासह स्थानिक व्हेरिएबलची स्वतःची प्रत असते. त्यांचे संदर्भ स्थानिक व्हेरिएबल्स आहेत आणि म्हणून ते थ्रेड स्टॅकवर साठवले जातात. तथापि, दोन भिन्न संदर्भ ढीगावरील एकाच वस्तूकडे निर्देश करतात.

कृपया लक्षात घ्या की सामान्यऑब्जेक्ट 3च्या लिंक्स आहेतऑब्जेक्ट 2आणिऑब्जेक्ट 4सदस्य व्हेरिएबल्स म्हणून (बाणांद्वारे दर्शविलेले). या लिंक्सद्वारे, दोन धागे प्रवेश करू शकतातऑब्जेक्ट 2आणिऑब्जेक्ट4.

आकृती स्थानिक व्हेरिएबल देखील दर्शवते (स्थानिक व्हेरिएबल 1पद्धत दोन पासून ). त्याच्या प्रत्येक प्रतमध्ये दोन भिन्न वस्तू दर्शविणारे भिन्न संदर्भ असतात (ऑब्जेक्ट १आणिऑब्जेक्ट 5) आणि समान नाही. सैद्धांतिकदृष्ट्या, दोन्ही थ्रेड्स दोन्हीमध्ये प्रवेश करू शकतातऑब्जेक्ट १, त्यामुळे तेऑब्जेक्ट 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);
}

run() मेथड एक() मेथडला कॉल करते आणि one() यामधून दोन() ला कॉल करते .

वन() पद्धत आदिम स्थानिक व्हेरिएबल घोषित करते (स्थानिक एक) प्रकार int आणि स्थानिक व्हेरिएबल (स्थानिक दोन), जे ऑब्जेक्टचा संदर्भ आहे.

one() पद्धत चालवणारा प्रत्येक थ्रेड स्वतःची प्रत तयार करेलस्थानिक एकआणिस्थानिक दोनतुमच्या स्टॅकमध्ये. चलस्थानिक एकप्रत्येक थ्रेडच्या स्टॅकवर असल्याने एकमेकांपासून पूर्णपणे विभक्त केले जातील. दुसरा धागा त्याच्या प्रतीमध्ये काय बदल करतो हे एक धागा पाहू शकत नाहीस्थानिक एक.

one() पद्धत चालवणारा प्रत्येक थ्रेड स्वतःची प्रत देखील तयार करतोस्थानिक दोन. तथापि, दोन भिन्न प्रतीस्थानिक दोनशेवटी ढीगावरील समान वस्तूकडे निर्देश करणे. वस्तुस्थिती अशी आहेस्थानिक दोनस्टॅटिक व्हेरिएबलद्वारे संदर्भित ऑब्जेक्टकडे निर्देश करतेउदाहरण. स्टॅटिक व्हेरिएबलची फक्त एक प्रत असते आणि ती प्रत हिपवर साठवली जाते.

त्यामुळे दोन्ही प्रतीस्थानिक दोनशेवटी समान सामायिक उदाहरणाकडे निर्देश करणे . सामायिक उदाहरण देखील ढीग वर संग्रहित आहे. ते जुळतेऑब्जेक्ट 3वरील चित्रात.

लक्षात घ्या की शेअर्ड क्लासमध्ये दोन सदस्य व्हेरिएबल्स देखील असतात. सदस्य व्हेरिएबल्स स्वतः ऑब्जेक्टसह ढीग वर संग्रहित केले जातात. दोन सदस्य व्हेरिएबल्स इतर दोन वस्तूंकडे निर्देश करतातपूर्णांक. या पूर्णांक वस्तू अनुरूप आहेतऑब्जेक्ट 2आणिऑब्जेक्ट 4आकृतीवर.

हे देखील लक्षात ठेवा की two() पद्धत नावाचे स्थानिक व्हेरिएबल तयार करतेस्थानिक एक. हे स्थानिक व्हेरिएबल पूर्णांक प्रकारातील ऑब्जेक्टचा संदर्भ आहे . पद्धत लिंक सेट करतेस्थानिक एकनवीन पूर्णांक उदाहरणाकडे निर्देश करण्यासाठी . लिंक त्याच्या कॉपीमध्ये संग्रहित केली जाईलस्थानिक एकप्रत्येक धाग्यासाठी. हीपवर दोन पूर्णांक उदाहरणे संग्रहित केली जातील आणि प्रत्येक वेळी ती कार्यान्वित केल्यावर ही पद्धत नवीन पूर्णांक ऑब्जेक्ट तयार करते, ही पद्धत अंमलात आणणारे दोन थ्रेड स्वतंत्र पूर्णांक उदाहरणे तयार करतील . ते जुळतातऑब्जेक्ट १आणिऑब्जेक्ट 5वरील चित्रात.

Integer प्रकाराच्या शेअर्ड क्लासमधील दोन सदस्य व्हेरिएबल्सकडेही लक्ष द्या , जो एक आदिम प्रकार आहे. हे व्हेरिएबल्स सदस्य व्हेरिएबल्स असल्यामुळे, ते अजूनही ऑब्जेक्टसह ढीगवर साठवले जातात. थ्रेड स्टॅकवर फक्त स्थानिक चल संग्रहित केले जातात.