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

Java में OutOfMemoryError क्या है और OOM का मूल कारण खोजने के चरण?


OutOfMemoryError JVM द्वारा फेंका जाता है, जब JVM के पास अलॉट करने के लिए पर्याप्त उपलब्ध मेमोरी नहीं होती। OutOfMemoryError Exception क्लास हायरार्की में Error कैटेगरी में आता है।

OutOfMemoryError जनरेट करने के लिए

  • हम एक बड़ा मेमोरी चंक अलॉट करेंगे, जो हीप मेमोरी स्टोरेज को समाप्त कर देगा।
  • हम मेमोरी अलॉट करते रहेंगे और एक बिंदु आएगा जब JVM के पास अलॉट करने के लिए पर्याप्त मेमोरी नहीं होगी, तब OutOfMemoryError फेंका जाएगा।
  • एक बार जब हम OutOfMemory एरर को पकड़ लेंगे, तो हम एरर को लॉग कर सकते हैं।

उदाहरण

public class OutOfMemoryErrorDemo {
    public static void main(String[] args) throws Exception {
        int dummyArraySize = 15;
        System.out.println("Max JVM memory: " + Runtime.getRuntime().maxMemory());
        long memoryConsumed = 0;
        try {
            long[] memoryAllocated = null;
            for(int loop = 0; loop < Integer.MAX_VALUE; loop++) {
                memoryAllocated = new long[dummyArraySize];
                memoryAllocated[0] = 0;
                memoryConsumed += dummyArraySize * Long.SIZE;
                System.out.println("Memory Consumed till now: " + memoryConsumed);
                dummyArraySize *= dummyArraySize * 2;
                Thread.sleep(500);
            }
        } catch (OutOfMemoryError outofMemory) {
            System.out.println("Out of memory error पकड़ा गया");
            // जानकारी लॉग करें, ताकि हम स्टैटिस्टिक्स जनरेट कर सकें
            throw outofMemory;
        }
    }
}

आउटपुट

Max JVM memory: 119537664
Memory Consumed till now: 960
Memory Consumed till now: 29760
Memory Consumed till now: 25949760
Out of memory error पकड़ा गया
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at OutOfMemoryErrorDemo.main(OutOfMemoryErrorDemo.java:9)

OOM का मूल कारण खोजने के चरण

चरण 1: OutOfMemoryError पर हीप डंप जनरेट करें

एप्लिकेशन को VM आर्गुमेंट -XX:+HeapDumpOnOutOfMemoryError के साथ शुरू करें। यह JVM को OOM होने पर हीप डंप उत्पन्न करने के लिए कहेगा।

$ java -XX:+HeapDumpOnOutOfMemoryError ...

चरण 2: समस्या को पुन: उत्पन्न करें

यदि हम डेवलपमेंट एनवायरनमेंट में समस्या को पुन: उत्पन्न नहीं कर सकते, तो हमें प्रोडक्शन एनवायरनमेंट का उपयोग करना पड़ सकता है। जब हम समस्या को पुन: उत्पन्न करते हैं और एप्लिकेशन OOM फेंकता है, तो यह एक हीप डंप फाइल जनरेट करेगा।

चरण 3: हीप डंप फाइल का उपयोग करके समस्या की जांच करें

VisualVM का उपयोग हीप डंप फाइल को पढ़ने और समस्या का निदान करने के लिए करें। VisualVM JDK_HOME/bin/jvisualvm में स्थित एक प्रोग्राम है। हीप डंप फाइल में एप्लिकेशन के मेमोरी उपयोग के बारे में सभी जानकारी होती है।


  1. इवेंट हैंडलिंग क्या है और Java में इवेंट हैंडलिंग के कंपोनेंट्स का वर्णन करें? इवेंट हैंडलिंग क्या है और Java में इवेंट हैंडलिंग के कंपोनेंट्स का वर्णन करें?

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

  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 में टाइटल, बॉर्डर, (वैकल्पिक) मेनू बार और यूज़र-स्पेसिफाइड कंपोनेंट्स के साथ एक विंडो होती है। ए