जावा स्टैक एंड हीप: जावा मेमोरी एलोकेशन ट्यूटोरियल

विषय - सूची:

Anonim

स्टैक मेमोरी क्या है?

जावा में स्टैक मेमोरी का एक भाग है जिसमें विधियाँ, स्थानीय चर और संदर्भ चर शामिल हैं। स्टैक मेमोरी को हमेशा लास्ट-इन-फर्स्ट-आउट ऑर्डर में संदर्भित किया जाता है। स्टैक में स्थानीय चर बनाए जाते हैं।

हीप मेमोरी क्या है?

हीप मेमोरी का एक सेक्शन है जिसमें ऑब्जेक्ट्स होते हैं और इसमें रेफरेंस चर भी हो सकते हैं। उदाहरण चर ढेर में बनाए गए हैं

जावा में मेमोरी आवंटन

जावा में मेमोरी आवंटन वह प्रक्रिया है जिसमें वर्चुअल मेमोरी सेक्शन को प्रोग्राम में स्ट्रक्चर और क्लासेस के वेरिएबल और इंस्टेंस को स्टोर करने के लिए अलग रखा जाता है। हालाँकि, स्मृति को किसी ऑब्जेक्ट को घोषणा में आवंटित नहीं किया गया है, लेकिन केवल एक संदर्भ बनाया गया है। ऑब्जेक्ट की मेमोरी आवंटन के लिए, नई () विधि का उपयोग किया जाता है, इसलिए ऑब्जेक्ट को हमेशा हीप पर मेमोरी आवंटित की जाती है।

जावा मेमोरी आवंटन को निम्नलिखित वर्गों में विभाजित किया गया है:

  1. ढेर
  2. ढेर
  3. कोड
  4. स्थिर

स्मृति का यह विभाजन इसके प्रभावी प्रबंधन के लिए आवश्यक है।

  • कोड खंड आपके शामिल बाईटकोड
  • ढेर स्मृति की धारा में शामिल तरीकों, स्थानीय चर, और संदर्भ चर।
  • ढेर अनुभाग वाली वस्तुओं (भी संदर्भ चर शामिल हो सकते हैं)।
  • स्टेटिक अनुभाग वाली स्टेटिक डेटा / तरीकों

स्थानीय और उदाहरण चर के बीच अंतर

इंस्टेंस चर को एक वर्ग के अंदर घोषित किया जाता है, लेकिन एक विधि के अंदर नहीं

class Student{int num; // num is instance variablepublic void showData{}

स्थानीय चर विधि तर्कों सहित एक विधि के अंदर घोषित किए जाते हैं ।

public void sum(int a){int x = int a + 3;// a , x are local variables;}

स्टैक और हीप के बीच अंतर


यदि वीडियो उपलब्ध नहीं है तो यहां क्लिक करें

आइए इसे बेहतर समझने के लिए एक उदाहरण लेते हैं।

विचार करें कि आपकी मुख्य विधि कॉलिंग विधि m1 है

public void m1{int x=20}

स्टैक जावा में, विधि m1 से एक फ्रेम बनाया जाएगा।

स्टैक में m1 के लिए फ्रेम में m1 में वेरिएबल X भी बनाया जाएगा। (नीचे चित्र देखें)।

विधि m1, कॉलिंग मेथड m2 है। स्टैक जावा में, फ्रेम एम 1 के शीर्ष पर एम 2 के लिए एक नया फ्रेम बनाया जाता है।

स्टैक में एक फ्रेम एम 2 में वैरिएबल बी और सी भी बनाया जाएगा।

public void m2(int b){boolean c;}

समान विधि m2 कॉलिंग विधि m3 है। फिर से स्टैक के शीर्ष पर एक फ्रेम m3 बनाया जाता है (नीचे की छवि देखें)।

अब कहते हैं कि हमारी विधि m3 वर्ग "खाता" के लिए एक ऑब्जेक्ट बना रही है, जिसमें दो उदाहरण हैं चर int p और int q।

Account {Int p;Int q;}

यहाँ विधि m3 के लिए कोड है

public void m3(){Account ref = new Account();// more code}

बयान नया खाता () ढेर में खाते की एक वस्तु का निर्माण करेगा।

स्टैक जावा में संदर्भ चर "रेफ" बनाया जाएगा।

असाइनमेंट ऑपरेटर हीप में ऑब्जेक्ट को इंगित करने के लिए एक संदर्भ चर बना देगा।

एक बार विधि ने अपना निष्पादन पूरा कर लिया है। नियंत्रण का प्रवाह कॉलिंग विधि पर वापस जाएगा। इस मामले में कौन सी विधि एम 2 है।

विधि m3 से स्टैक को बाहर निकाल दिया जाएगा।

चूंकि संदर्भ चर अब ढेर में ऑब्जेक्ट को इंगित नहीं करेगा, इसलिए यह कचरा संग्रह के लिए पात्र होगा।

एक बार विधि एम 2 ने अपने निष्पादन को पूरा कर लिया है। यह स्टैक से बाहर पॉप किया जाएगा, और इसके सभी चर को फ्लश किया जाएगा और अब उपयोग के लिए उपलब्ध नहीं होगा।

इसी तरह विधि m1 के लिए।

आखिरकार, नियंत्रण का प्रवाह कार्यक्रम के प्रारंभ बिंदु पर वापस आ जाएगा। जो आमतौर पर, "मुख्य" विधि है।

क्या होगा यदि ऑब्जेक्ट के उदाहरण चर के रूप में एक संदर्भ है?

public static void main(String args[]) {A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d; //more code }

इस मामले में, संदर्भ चर "बच्चे" को ढेर में बनाया जाएगा, जो बदले में अपनी वस्तु की ओर इशारा करेगा, नीचे दिखाए गए चित्र की तरह कुछ।

सारांश:

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