यदि आपने OutOfMemoryError को पकड़ा है, तो इसका मतलब यह नहीं है कि आपका एप्लिकेशन कई ऑब्जेक्ट बनाता है जो कचरा कलेक्टर द्वारा साफ नहीं किया जा सकता है और -Xmx पैरामीटर का उपयोग करके आपके द्वारा आवंटित सभी मेमोरी को भर सकता है। कम से कम, मैं दो अन्य मामलों के साथ आ सकता हूं जहां आप इस त्रुटि को देख सकते हैं। तथ्य यह है कि जावा प्रक्रिया मेमोरी -Xmx क्षेत्र तक सीमित नहीं है, जहां आपका एप्लिकेशन प्रोग्रामेटिक रूप से ऑब्जेक्ट बनाता है।
जावा प्रक्रिया के कब्जे वाले स्मृति क्षेत्र में कई भाग होते हैं। OutOfMemoryError का प्रकार इस बात पर निर्भर करता है कि उनमें से कौन अंतरिक्ष से बाहर भागा है।
1. java.lang.OutOfMemoryError: जावा हीप स्पेस
ढेर पर पर्याप्त जगह नहीं है, अर्थात्, मेमोरी क्षेत्र में जिसमें आपके एप्लिकेशन में प्रोग्रामेटिक रूप से बनाए गए ऑब्जेक्ट रखे गए हैं। आकार -Xms और -Xmx विकल्पों द्वारा निर्दिष्ट किया गया है। यदि आप ऑब्जेक्ट बनाने की कोशिश करते हैं, और ढेर पर कोई जगह नहीं बची है, तो आपको यह त्रुटि मिलती है। आमतौर पर समस्या एक मेमोरी लीक में निहित है, जिनमें से एक महान कई हैं, और इंटरनेट बस इस विषय पर लेखों से भरा है।
2.java.lang.OutOfMemoryError: PermGen space
यह त्रुटि तब होती है जब स्थायी क्षेत्र में पर्याप्त जगह नहीं होती है, जिसका आकार -XX द्वारा निर्दिष्ट है: PermSize और -XX: MaxPermSize पैरामीटर। वहाँ क्या होता है और आउटऑफ़मेरीऑरर से कैसे निपटना है, जो वहां उत्पन्न होता है, मैंने पहले ही
यहां विस्तार से वर्णन किया
है ।
3.java.lang.OutOfMemoryError: GC ओवरहेड सीमा पार हो गई है
यह त्रुटि पहले और दूसरे क्षेत्रों के अतिप्रवाह के दौरान हो सकती है। यह इस तथ्य से जुड़ा हुआ है कि थोड़ी सी मेमोरी शेष है और जीसी लगातार काम कर रहा है, कुछ स्थान खाली करने की कोशिश कर रहा है। इस त्रुटि को -XX: -UseGCOverheadLimit पैरामीटर का उपयोग करके अक्षम किया जा सकता है, लेकिन, निश्चित रूप से, आपको इसे अक्षम नहीं करना चाहिए, लेकिन या तो मेमोरी लीक की समस्या को हल करें, या अधिक वॉल्यूम आवंटित करें, या GC सेटिंग्स बदलें।
4.java.lang.OutOfMemoryError: नया देशी धागा बनाने में असमर्थ
मुझे पहली बार इस त्रुटि का सामना करना पड़ा था जब मैं तनाव परीक्षण कर रहा था और उन अधिकतम उपयोगकर्ताओं की संख्या का पता लगाने की कोशिश कर रहा था जो हमारे वेब एप्लिकेशन के साथ काम कर सकते हैं। मैंने एक विशेष उपकरण का उपयोग किया, जो उपयोगकर्ताओं को अपने मानक कार्यों में लॉग इन और अनुकरण करने की अनुमति देता है। ग्राहकों की एक निश्चित संख्या पर, मुझे OutOfMemoryError मिलना शुरू हुआ। वास्तव में संदेश के पाठ को नहीं पढ़ना और यह सोचना कि मेरे पास उपयोगकर्ता सत्र और अन्य आवश्यक वस्तुओं को बनाने के लिए पर्याप्त मेमोरी नहीं है, मैंने एप्लिकेशन हीप (-Xmx) के आकार में वृद्धि की। मेरे आश्चर्य की कल्पना कीजिए जब उसके बाद सिस्टम के साथ काम करने वाले उपयोगकर्ताओं की संख्या केवल घट गई। आइए इस पर एक नज़र डालें कि यह कैसे हुआ।
वास्तव में, 32-बिट मशीन पर खिड़कियों पर पुन: पेश करना बहुत आसान है, क्योंकि प्रक्रिया 2 जीबी से अधिक नहीं आवंटित करती है।
मान लीजिए कि आपके पास बड़ी संख्या में समवर्ती उपयोगकर्ताओं के साथ एक एप्लिकेशन है जो पैरामीटर -Xmx1024M -XX के साथ शुरू होता है: MaxPermSize = 256M -Xss512K। यदि 2 जी पूरी प्रक्रिया के लिए उपलब्ध है, तो एक और 768M अभी भी मुफ्त है। यह इस शेष मेमोरी में है कि थ्रेड्स के ढेर बनाए जाते हैं। इस प्रकार, लगभग आप 768 * (1024/512) = 1536 से अधिक नहीं बना सकते हैं (मैं इन मापदंडों के साथ 1316 बनाने में कामयाब रहा) थ्रेड्स (लेख की शुरुआत में तस्वीर देखें), जिसके बाद आपको आउटऑफ़मैरीमोरर मिलेगा। यदि आप -Xmx बढ़ाते हैं, तो आपके द्वारा बनाए जाने वाले थ्रेड की संख्या तदनुसार घट जाएगी। घटते हुए -Xss के साथ विकल्प, अधिक थ्रेड्स बनाने में सक्षम होने के लिए, हमेशा बाहर का रास्ता नहीं है, क्योंकि यह संभव है कि आपके पास सिस्टम में थ्रेड्स हैं जिनके लिए काफी बड़े स्टैक की आवश्यकता होती है। उदाहरण के लिए, एक प्रारंभिक सूत्र या कुछ पृष्ठभूमि कार्य। लेकिन फिर भी एक उपाय है। यह पता चलता है कि प्रोग्राम बनाते समय, आप स्टैक आकार निर्दिष्ट कर सकते हैं:
थ्रेड (थ्रेडग्रुप समूह, रनने योग्य लक्ष्य, स्ट्रिंग नाम, लंबी स्टैकसाइज) । इस प्रकार, आप -Xss को काफी छोटा कर सकते हैं, और ऊपर उल्लिखित कंस्ट्रक्टर का उपयोग करके बनाए गए अलग-अलग थ्रेड्स में बड़े स्टैक की आवश्यकता होती है।
अधिक विस्तार से, स्ट्रीम स्टैक में क्या निहित है, और यह मेमोरी कहां जाती है,
यहां पढ़ा जा सकता
है ।
बेशक, यह समस्या आपको थोड़ी दूर की लग सकती है, क्योंकि अधिकांश सर्वर अब 64-बिट आर्किटेक्चर पर घूमते हैं, लेकिन फिर भी मुझे लगता है कि यह उदाहरण बहुत उपयोगी है, क्योंकि यह पता लगाने में मदद करता है कि जावा प्रक्रिया मेमोरी के किन हिस्सों में शामिल है।