Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

Java में StackOverflowError और OutOfMemoryError में क्या अंतर है?


जब हम कोई 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 फ्लैग से बढ़ाया जा सकता है)

तुलना तालिका

विशेषताStackOverflowErrorOutOfMemoryError
मेमोरी क्षेत्रस्टैकहीप
मुख्य कारणअत्यधिक/अनंत मेथड कॉल्स (रिकर्सन)अत्यधिक ऑब्जेक्ट निर्माण या मेमोरी लीक
समाधानरिकर्सन ठीक करें, स्टैक साइज बढ़ाएं (-Xss)मेमोरी लीक ठीक करें, हीप साइज बढ़ाएं (-Xmx)
Error क्लासjava.lang.StackOverflowErrorjava.lang.OutOfMemoryError

निष्कर्ष: StackOverflowError स्टैक मेमोरी की समस्या है (मेथड कॉल्स), जबकि OutOfMemoryError हीप मेमोरी की समस्या है (ऑब्जेक्ट्स)। दोनों ही java.lang.Error के सबक्लास हैं और इन्हें सामान्यतः पकड़ा (catch) नहीं जाना चाहिए।

  1. Java में JTextField और JTextArea में क्या अंतर है? Java में JTextField और JTextArea में क्या अंतर है?

    Java में JTextField और JTextArea के बीच मुख्य अंतर यह है कि एक JTextField GUI एप्लिकेशन में टेक्स्ट की सिंगल लाइन एंटर करने की अनुमति देता है जबकि JTextArea GUI एप्लिकेशन में टेक्स्ट की मल्टीपल लाइन्स एंटर करने की अनुमति देता है। JTextField एक JTextField सबसे महत्वपूर्ण कंपोनेंट्स में से एक है जो

  1. Java में JFrame और JDialog में क्या अंतर है? Java में JFrame और JDialog में क्या अंतर है?

    JFrame फ्रेम में जोड़े गए कंपोनेंट्स को इसकी सामग्री कहा जाता है, इन्हें contentPane द्वारा प्रबंधित किया जाता है। JFrame में कंपोनेंट जोड़ने के लिए, हमें इसके contentPane का उपयोग करना चाहिए। एक JFrame में टाइटल, बॉर्डर, (वैकल्पिक) मेनू बार और यूज़र-स्पेसिफाइड कंपोनेंट्स के साथ एक विंडो होती है। ए

  1. Java में GridLayout और GridBagLayout में क्या अंतर है? Java में GridLayout और GridBagLayout में क्या अंतर है?

    एक GridLayout सभी कंपोनेंट्स को एक आयताकार ग्रिड में रखता है और इसे समान आकार के आयतों में विभाजित करता है और प्रत्येक कंपोनेंट को एक आयत के अंदर रखा जाता है जबकि GridBagLayout एक लचीला लेआउट मैनेजर है जो कंपोनेंट्स को वर्टिकली और हॉरिजॉन्टली संरेखित करता है बिना यह आवश्यकता के कि कंपोनेंट्स समान आक