जावा डेवलपर साक्षात्कार की तैयारी करते समय, यह समझना कि जावा वर्चुअल मशीन (जेवीएम) के भीतर मेमोरी कैसे व्यवस्थित की जाती है, चर्चा का एक प्रमुख विषय हो सकता है। यह पोस्ट जेवीएम में विभिन्न मेमोरी क्षेत्रों पर प्रकाश डालेगी - विशेष रूप से स्टैक, हीप, और मेटास्पेस - आवश्यक बिंदु प्रदान करेगी जिन पर साक्षात्कारकर्ता ध्यान केंद्रित कर सकते हैं। इन अवधारणाओं से खुद को परिचित करके, आप अपनी साक्षात्कार तैयारी बढ़ा सकते हैं और जावा मेमोरी प्रबंधन की अपनी समझ प्रदर्शित कर सकते हैं।
JDK, JRE और JVM की भूमिकाएँ
जेवीएम के मेमोरी स्पेस में सीधे गोता लगाने से पहले, आइए जल्दी से जावा डेवलपमेंट किट (जेडीके), जावा रनटाइम एनवायरनमेंट (जेआरई), और जावा के बीच संबंध का पता लगाएं। वर्चुअल मशीन (JVM), और पहचानें कि वास्तव में JVM इस ढांचे में कहां फिट बैठता है।
इस समझ के साथ, अब हम अपना ध्यान जेवीएम के मेमोरी क्षेत्रों, विशेष रूप से स्टैक, हीप और मेटास्पेस पर केंद्रित कर सकते हैं, यह देखने के लिए कि जावा अनुप्रयोगों के निष्पादन के दौरान मेमोरी कैसे व्यवस्थित की जाती है।
1. स्टैक मेमोरी
स्टैक मेमोरी में क्या संग्रहीत है:
-
विधि कॉल: हर बार जब कोई विधि लागू की जाती है, तो एक नया फ्रेम स्टैक पर धकेल दिया जाता है, जिसमें शामिल हैं:
-
विधि पैरामीटर्स: विधि को दिए गए तर्क।
-
स्थानीय चर: विधि के भीतर घोषित चर। यह भी शामिल है:
-
आदिम डेटा प्रकार: आदिम प्रकार के रूप में घोषित स्थानीय चर के वास्तविक मान सीधे स्टैक में संग्रहीत होते हैं।
-
ऑब्जेक्ट्स का संदर्भ: ऑब्जेक्ट प्रकार के स्थानीय चर के लिए, केवल वास्तविक ऑब्जेक्ट्स (जो ढेर मेमोरी में रहते हैं) के संदर्भ स्टैक में संग्रहीत होते हैं।
-
वापसी पता: विधि निष्पादन पूरा होने के बाद वापस लौटने का पता।
स्टैक मेमोरी के बारे में अतिरिक्त जानकारी:
-
मेमोरी एलोकेशन और डीलोकेशन: किसी विधि के लिए मेमोरी तब आवंटित की जाती है जब विधि को कॉल किया जाता है और निष्पादन समाप्त होने पर डिलीट कर दिया जाता है।
-
थ्रेड सुरक्षा: जावा में प्रत्येक थ्रेड की अपनी स्टैक मेमोरी होती है, जो यह सुनिश्चित करती है कि स्थानीय वेरिएबल थ्रेड-सुरक्षित हैं।
-
सीमित आकार: स्टैक मेमोरी आम तौर पर आकार में सीमित होती है, जिससे बहुत अधिक विधि कॉल करने पर स्टैक ओवरफ्लो त्रुटियां हो सकती हैं (उदाहरण के लिए, गहरी रिकर्सन के मामले में)।
2. ढेर मेमोरी
हीप मेमोरी में क्या संग्रहीत है:
-
ऑब्जेक्ट्स: केवल ऑब्जेक्ट हीप मेमोरी में संग्रहीत होते हैं। यह भी शामिल है:
-
उपयोगकर्ता-परिभाषित क्लास ऑब्जेक्ट: उपयोगकर्ता-परिभाषित कक्षाओं से बनाए गए उदाहरण।
-
अंतर्निहित क्लास ऑब्जेक्ट्स: जावा की अंतर्निहित कक्षाओं के उदाहरण, जिनमें सरणी और ArrayList, HashMap, आदि जैसी संग्रह कक्षाएं शामिल हैं।
-
इंस्टेंस वेरिएबल्स: किसी ऑब्जेक्ट से संबंधित गैर-स्थैतिक फ़ील्ड के रूप में, इंस्टेंस वेरिएबल्स को ऑब्जेक्ट के साथ ढेर में संग्रहीत किया जाता है।
-
स्ट्रिंग पूल: ढेर में एक विशेष क्षेत्र जो स्ट्रिंग अक्षर संग्रहीत करता है। यदि एक स्ट्रिंग शाब्दिक बनाया जाता है, तो जावा पहले स्ट्रिंग पूल की जाँच करता है; यदि यह मौजूद है, तो नई वस्तु बनाने के बजाय मौजूदा वस्तु का संदर्भ वापस कर दिया जाता है।
हीप मेमोरी के बारे में अतिरिक्त जानकारी:
-
मेमोरी आवंटन: जब ऑब्जेक्ट बनाया जाता है तो मेमोरी आवंटित की जाती है और जब ऑब्जेक्ट पहुंच योग्य नहीं रह जाता है तो कचरा संग्रहकर्ता द्वारा हटा दिया जाता है।
-
कचरा संग्रहण: कचरा संग्रहकर्ता स्वचालित रूप से उन वस्तुओं की पहचान करके और उन्हें हटाकर ढेर में मेमोरी का प्रबंधन करता है जो अब पहुंच योग्य या आवश्यक नहीं हैं।
-
साझा मेमोरी: हीप मेमोरी को सभी थ्रेड्स के बीच साझा किया जाता है, जिससे अंतर-थ्रेड संचार की अनुमति मिलती है। एक थ्रेड द्वारा बनाई गई वस्तुओं को अन्य थ्रेड द्वारा एक्सेस, संशोधित या संदर्भित किया जा सकता है। इससे साझा वस्तुओं तक पहुंच प्रबंधित करने, डेटा स्थिरता सुनिश्चित करने और दौड़ की स्थिति से बचने के लिए मल्टीथ्रेडिंग तकनीकों के उपयोग की आवश्यकता होती है।
3. विधि क्षेत्र / मेटास्पेस
मेथड एरिया को जावा 8 और बाद में मेटास्पेस के रूप में भी जाना जाता है।
मेथड एरिया/मेटास्पेस में क्या संग्रहीत है:
-
क्लास मेटाडेटा: कक्षाओं के बारे में जानकारी, जैसे उनकी संरचना (फ़ील्ड, विधियाँ और इंटरफ़ेस) और अन्य कक्षाओं से संबंध, मेटास्पेस में संग्रहीत होते हैं।
-
स्टेटिक वेरिएबल्स: कक्षाओं में घोषित स्टेटिक फ़ील्ड मेटास्पेस में संग्रहीत किए जाते हैं, जिससे वे उस वर्ग के सभी उदाहरणों के लिए पहुंच योग्य हो जाते हैं।
-
रनटाइम कॉन्स्टेंट पूल: इस पूल में रनटाइम के दौरान उपयोग किए जाने वाले शाब्दिक और संदर्भ शामिल हैं। स्ट्रिंग अक्षर के लिए, संदर्भ यहां संग्रहीत किए जाते हैं (वास्तविक मान स्ट्रिंग पूल में ढेर में संग्रहीत किए जा रहे हैं), जबकि अन्य अक्षर (जैसे संख्यात्मक और बूलियन) सीधे मान के रूप में संग्रहीत किए जाते हैं।
विधि क्षेत्र/मेटास्पेस के बारे में अतिरिक्त जानकारी:
-
साझा मेमोरी: विधि क्षेत्र सभी थ्रेड्स के बीच साझा किया जाता है, जिसका अर्थ है कि जेवीएम के भीतर केवल एक मेटास्पेस उदाहरण मौजूद है। यह कक्षा की जानकारी के कुशल प्रबंधन की अनुमति देता है और मेमोरी ओवरहेड को कम करता है।
-
सिंक्रनाइज़ेशन: विसंगतियों को रोकने और थ्रेड सुरक्षा सुनिश्चित करने के लिए मेथड एरिया तक पहुंचने पर जेवीएम सिंक्रोनाइज़ेशन को संभालता है।
निष्कर्ष
किसी भी जावा डेवलपर के लिए इन तीन मेमोरी क्षेत्रों को समझना महत्वपूर्ण है। वे कचरा संग्रहण, मेमोरी लीक, और थ्रेड सुरक्षा जैसी महत्वपूर्ण अवधारणाओं की नींव बनाते हैं, जिन पर इस श्रृंखला के आगामी लेखों में चर्चा की जाएगी।
संबंधित पोस्ट
हैप्पी कोडिंग!