JVM मेमोरी स्पेस को दो भागों में विभाजित करता है: स्टैक और हीप। स्टैक स्पेस मुख्य रूप से मेथड एक्जीक्यूशन के क्रम और लोकल वेरिएबल्स को स्टोर करने के लिए उपयोग किया जाता है।
स्टैक हमेशा ब्लॉक्स को LIFO (लास्ट इन फर्स्ट आउट) ऑर्डर में स्टोर करता है, जबकि हीप मेमोरी डायनामिक एलोकेशन का उपयोग करके मेमोरी ब्लॉक्स को एलोकेट और डीएलोकेट करता है।
हीप को एलोकेट की गई मेमोरी निम्नलिखित घटनाओं में से एक होने तक जीवित रहती है:
- प्रोग्राम टर्मिनेट हो जाता है
- मेमोरी फ्री हो जाती है
इसके विपरीत, स्टैक को एलोकेट की गई मेमोरी तब तक जीवित रहती है जब तक फंक्शन रिटर्न नहीं हो जाता। नीचे मुख्य अंतर दिए गए हैं:
| क्र.सं. | मुख्य बिंदु | स्टैक | हीप मेमोरी |
|---|---|---|---|
| 1 | बुनियादी | स्टैक मेमोरी का उपयोग उन आइटम्स को स्टोर करने के लिए किया जाता है जिनका जीवन बहुत छोटा होता है जैसे लोकल वेरिएबल्स, ऑब्जेक्ट्स के रेफरेंस वेरिएबल्स | हीप मेमोरी ऑब्जेक्ट्स और JRE क्लासेज को स्टोर करने के लिए एलोकेट की जाती है |
| 2 | क्रम | स्टैक हमेशा LIFO (लास्ट इन फर्स्ट आउट) ऑर्डर में रिजर्व होता है | हीप मेमोरी डायनामिक एलोकेशन है, मेमोरी में ब्लॉक्स को एलोकेट और डीएलोकेट करने का कोई फिक्स्ड पैटर्न नहीं होता |
| 3 | आकार | JVM पैरामीटर -XSS का उपयोग करके स्टैक मेमोरी का आकार बढ़ाया जा सकता है | JVM ऑप्शन -Xms और -Xmx का उपयोग करके हीप मेमोरी का आकार बढ़ाया या घटाया जा सकता है |
| 4 | विजिबिलिटी | वेरिएबल्स केवल ओनर थ्रेड को विजिबल होते हैं | यह सभी थ्रेड्स को विजिबल होता है |
| 5 | एक्सेप्शन | JVM java.lang.StackOverflowError थ्रो करता है | JVM java.lang.OutOfMemoryError थ्रो करता है |
मुख्य बिंदु सारांश
- स्टैक: थ्रेड-प्राइवेट, फास्ट एक्सेस, LIFO, ऑटोमैटिक मेमोरी मैनेजमेंट, छोटा आकार
- हीप: शेयर्ड, स्लो एक्सेस, डायनामिक, गार्बेज कलेक्टेड, बड़ा आकार
स्टैक ओवरफ्लो आमतौर पर डीप रिकर्सन के कारण होता है, जबकि हीप ओवरफ्लो बड़ी संख्या में ऑब्जेक्ट्स बनाने या मेमोरी लीक के कारण होता है।