मेमोरी प्रबंधन Java

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

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

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

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

मेमोरी आबंटन Java

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

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

  1. ढेर
  2. धुआँरा
  3. Code
  4. स्थिर

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

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

स्थानीय और इंस्टेंस चर के बीच अंतर

उदाहरण चर घोषित किया गया है क्लास के अंदर लेकिन विधि के अंदर नहीं

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

स्थानीय चर घोषित कर दिया गया है अंदर a विधि सहित तरीका तर्क.

public void sum(int a){

int x = int a +  3;

// a , x are local variables;

}

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

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

इसे बेहतर ढंग से समझने के लिए आइए एक उदाहरण लेते हैं। मान लीजिए कि आपकी मुख्य विधि m1 विधि को कॉल कर रही है

public void m1{
int x=20
}

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

Java स्टैक और हीप

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

Java स्टैक और हीप

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

Java स्टैक और हीप

Java स्टैक और हीप

स्टैक में फ्रेम m2 में चर b और c भी बनाए जाएंगे।

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

Java स्टैक और हीप

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

Java स्टैक और हीप

Java स्टैक और हीप

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

Account {
             Int p;
             Int q;
       }

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

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

कथन new Account() हीप में account का ऑब्जेक्ट बनाएगा।

Java स्टैक और हीप

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

Java स्टैक और हीप

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

Java स्टैक और हीप

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

Java स्टैक और हीप

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

Java स्टैक और हीप

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

Java स्टैक और हीप

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

इसी प्रकार विधि 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 }

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

Java स्टैक और हीप

कचरा संग्रहण क्या है? Java?

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

जब किसी ऑब्जेक्ट का कोई संदर्भ नहीं होता है, तो यह मान लिया जाता है कि अब इसकी आवश्यकता नहीं है, और ऑब्जेक्ट द्वारा कब्जा की गई मेमोरी को पुनः प्राप्त किया जा सकता है। ऑब्जेक्ट को नष्ट करने की कोई स्पष्ट आवश्यकता नहीं है क्योंकि Java डी-आवंटन को स्वचालित रूप से संभालता है।

इस कार्य को करने वाली तकनीक को कहा जाता है कचरा इकठा करनाजो प्रोग्राम मेमोरी को डी-एलोकेट नहीं करते हैं, वे अंततः तब क्रैश हो सकते हैं जब सिस्टम में आवंटित करने के लिए कोई मेमोरी नहीं बचती है। इन प्रोग्रामों के बारे में कहा जाता है कि स्म्रति से रिसाव। कचरा संग्रहण Java स्वतः घटित होता है कार्यक्रम के जीवनकाल के दौरान, मेमोरी को डी-एलोकेट करने की आवश्यकता को समाप्त किया जा सकता है और इस प्रकार मेमोरी लीक से बचा जा सकता है।

सी भाषा में, free() फ़ंक्शन का उपयोग करके गतिशील रूप से आवंटित मेमोरी को डी-एलोकेट करना प्रोग्रामर की ज़िम्मेदारी है। यहीं पर Java स्मृति प्रबंधन सुराग.

नोट: सभी ऑब्जेक्ट मेमोरी के हीप सेक्शन में बनाए जाते हैं। इस बारे में बाद में ट्यूटोरियल में विस्तार से बताया जाएगा।

उदाहरण: कचरा संग्रह तंत्र सीखने के लिए Java

चरण 1) निम्नलिखित कोड को संपादक में कॉपी करें।

class Student{
int a;
int b;
  public void setData(int c,int d){
    a=c;
    b=d;
  }
  public void showData(){
    System.out.println("Value of a = "+a);
    System.out.println("Value of b = "+b);
  }
  public static void main(String args[]){
    Student s1 = new Student();
    Student s2 = new Student();
    s1.setData(1,2);
    s2.setData(3,4);
    s1.showData();
    s2.showData();
    //Student s3;
    //s3=s2;
    //s3.showData();
    //s2=null;
    //s3.showData();
    //s3=null;
    //s3.showData();
  }
}

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


 कचरा संग्रह तंत्र

चरण 3) पंक्ति # 20,21,22 को अनकमेंट करें। कोड को सेव, संकलित और चलाएं।

चरण 4) जैसा कि नीचे चित्र में दिखाया गया है, दो संदर्भ चर एक ही वस्तु की ओर इशारा कर रहे हैं।

कचरा संग्रह तंत्र

चरण 5) पंक्ति # 23 और 24 पर टिप्पणी हटाएं। कोड संकलित करें, सहेजें और चलाएं

चरण 6) जैसा कि नीचे चित्र में दिखाया गया है, s2 शून्य हो जाता है, लेकिन s3 अभी भी ऑब्जेक्ट की ओर इशारा कर रहा है और जावा कचरा संग्रहण के लिए योग्य नहीं है।

 कचरा संग्रह तंत्र

चरण 7) पंक्ति संख्या 25 और 26 को अनकमेंट करें। सेव करें, कंपाइल करें और रन करें। Code

चरण 8) इस बिंदु पर ऑब्जेक्ट की ओर इशारा करने वाले कोई संदर्भ नहीं हैं और यह कचरा संग्रहण के लिए पात्र हो जाता है। इसे मेमोरी से हटा दिया जाएगा, और इसे वापस प्राप्त करने का कोई तरीका नहीं है।

 कचरा संग्रहकर्ता सीखें

किसी ऑब्जेक्ट को कैसे डिलीट करें Java?

1) यदि आप अपने ऑब्जेक्ट को गार्बेज कलेक्शन के लिए योग्य बनाना चाहते हैं, तो इसके संदर्भ चर को शून्य पर असाइन करें।

2) आदिम प्रकार ऑब्जेक्ट नहीं हैं। उन्हें शून्य नहीं सौंपा जा सकता।

किसी ऑब्जेक्ट को कैसे डिलीट करें Java

सारांश:

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

इस पोस्ट को संक्षेप में इस प्रकार लिखें: