जब हम कोई Java प्रोग्राम चलाते हैं, तो ऑपरेटिंग सिस्टम JVM को कुछ मेमोरी आवंटित करता है। JVM इस मेमोरी को दो भागों में बांटता है: स्टैक मेमोरी और हीप मेमोरी।
- स्टैक मेमोरी: मेथड्स के निष्पादन (execution) के लिए उपयोग होती है।
- हीप मेमोरी: ऑब्जेक्ट्स को स्टोर करने के लिए उपयोग होती है।
जब स्टैक भर जाता है, तो JVM java.lang.StackOverflowError फेंकता है और जब हीप भर जाता है, तो JVM java.lang.OutOfMemoryError फेंकता है।
StackOverflowError
- स्टैक मेथड्स के निष्पादन के लिए उपयोग होता है। हर मेथड कॉल के लिए स्टैक मेमोरी में एक ब्लॉक (स्टैक फ्रेम) बनता है।
- इस ब्लॉक में मेथड से संबंधित डेटा जैसे पैरामीटर्स, लोकल वेरिएबल्स या ऑब्जेक्ट्स के रेफरेंस स्टोर होते हैं।
- जब मेथड अपना निष्पादन पूरा कर लेता है, तो यह ब्लॉक स्टैक से हटा दिया जाता है।
- हर मेथड कॉल को अपना निष्पादन पूरा करके स्टैक छोड़ना चाहिए।
- अगर मेथड्स स्टैक में बने रहते हैं (जैसे अनंत रिकर्सन में), तो स्टैक भर जाता है और JVM
StackOverflowErrorफेंकता है।
मुख्य कारण:
- अनंत रिकर्सन (Infinite Recursion)
- बहुत गहरी मेथड कॉल चेन
- स्टैक साइज का छोटा होना (
-Xssफ्लैग से बढ़ाया जा सकता है)
OutOfMemoryError
- Java में बनाए गए ऑब्जेक्ट्स हीप मेमोरी में स्टोर होते हैं। जब ऑब्जेक्ट्स की आवश्यकता नहीं रहती, तो उन्हें मेमोरी से हटाया जाना चाहिए।
- गार्बेज कलेक्टर (Garbage Collector) अनावश्यक ऑब्जेक्ट्स को हीप से हटाता है।
- अगर हमारे ऑब्जेक्ट्स के लाइव रेफरेंस हैं, तो गार्बेज कलेक्टर उन्हें नहीं हटाता। यह केवल उन्हीं ऑब्जेक्ट्स को हटाता है जिनके लाइव रेफरेंस नहीं होते।
- अगर हीप मेमोरी में नए ऑब्जेक्ट्स के लिए जगह नहीं बचती, तो JVM
OutOfMemoryErrorफेंकता है।
मुख्य कारण:
- मेमोरी लीक (Memory Leak) - अनावश्यक ऑब्जेक्ट्स के रेफरेंस बने रहना
- बहुत बड़ी मात्रा में ऑब्जेक्ट्स बनाना
- हीप साइज का छोटा होना (
-Xmxफ्लैग से बढ़ाया जा सकता है)
तुलना तालिका
| विशेषता | StackOverflowError | OutOfMemoryError |
|---|---|---|
| मेमोरी क्षेत्र | स्टैक | हीप |
| मुख्य कारण | अत्यधिक/अनंत मेथड कॉल्स (रिकर्सन) | अत्यधिक ऑब्जेक्ट निर्माण या मेमोरी लीक |
| समाधान | रिकर्सन ठीक करें, स्टैक साइज बढ़ाएं (-Xss) | मेमोरी लीक ठीक करें, हीप साइज बढ़ाएं (-Xmx) |
| Error क्लास | java.lang.StackOverflowError | java.lang.OutOfMemoryError |
निष्कर्ष: StackOverflowError स्टैक मेमोरी की समस्या है (मेथड कॉल्स), जबकि OutOfMemoryError हीप मेमोरी की समस्या है (ऑब्जेक्ट्स)। दोनों ही java.lang.Error के सबक्लास हैं और इन्हें सामान्यतः पकड़ा (catch) नहीं जाना चाहिए।