2012-04-26 16 views
7

के बाद स्वयं को समाप्त कर देता है आउटऑफमेमरी त्रुटि के बाद जेवीएम स्वयं समाप्त हो जाता है? यदि नहीं तो क्यों? क्या यह संसाधनों को वापस पाने की कोशिश करेगा? या कोई अन्य कारण है?क्या JVM OutOfMemoryError

उत्तर

12

एक आउटऑफमेमोरी एरर जेवीएम को समाप्त नहीं करता है।

यदि यह बेकार नहीं है, तो यह THREAD को समाप्त करता है जिससे त्रुटि शुरू की गई थी। अन्य धागे ठीक चलते रहते हैं, बशर्ते वे आउटऑफमेमरी एरर भी न करें।

केवल सभी धागे समाप्त होने के बाद या शेष शेष धागे डिमन थ्रेड हैं, JVM समाप्त हो गया है।

यह जेवीएम को समाप्त नहीं करता है क्योंकि इसे नहीं करना है। JVM को समाप्त करना बहुत चरम ऑपरेशन है और यह हल्के ढंग से नहीं किया जाता है।

यह किसी भी संसाधन को वापस पाने का प्रयास नहीं करेगा, क्योंकि पुनर्प्राप्त करने के लिए कुछ भी नहीं है। ओओएमई फेंकने का कारण यह है कि: जेवीएम संसाधन प्राप्त नहीं कर सकता क्योंकि सभी संसाधनों को लिया जाता है। यह पहले से ही बाकी सब कुछ कर चुका है।

किसी को याद रखना चाहिए कि ओओएमई को उस थ्रेड में जरूरी नहीं है जो सबसे अधिक स्मृति का उपभोग करता है। एक थ्रेड सभी मेमोरी का उपभोग कर सकता है और अन्य थ्रेड पर प्रसंस्करण उत्पन्न कर सकता है जो "केवल एक बाइट" आवंटित करने का प्रयास करता है। निश्चित रूप से विफल रहता है और एक थैला आवंटित करने की कोशिश की गई थ्रेड ओओएमई द्वारा बाधित हो जाती है। ओओएमई से ठीक होने का यही कारण लगभग असंभव है।

1

यह इस बात पर निर्भर करता है कि आप उस त्रुटि को संभालते हैं या नहीं। यदि आप नहीं करते हैं तो इसके साथ आवेदन और वर्तमान धागा समाप्त कर दिया जाएगा। यदि यह धागा अंतिम चलने वाला धागा होता है (ज्यादातर मामलों में वर्तमान अनुप्रयोग का मुख्य धागा) JVM भी बाहर निकल जाएगा (हालांकि यह अभी भी कुछ लॉगिंग कर सकता है, बाहर निकलने से पहले मेमोरी डंप इत्यादि बना सकता है)।

यदि आप सामान्य रूप से त्रुटि को संभालते हैं तो आप JVM को रोकने से पहले थोड़ा सा सफाई करने का प्रयास करें। ज्यादातर मामलों में OutOfMemoryError से प्रयास करने और पुनर्प्राप्त करने का एक बुरा विचार है। अधिक जानकारी के लिए यहाँ देखें: Can the JVM recover from an OutOfMemoryError without a restart

+0

नहीं। यह केवल धागे को समाप्त करता है। पूरा जेवीएम नहीं। – Torben

+0

@ टोरबेन मेला पर्याप्त, मैं अपना जवाब अपडेट करूंगा। – Thomas

0

यह अपने आप समाप्त हो जाता है नहीं है, यह सिर्फ हुए कहा कि यह नहीं बना सकते कि किसी भी अधिक वस्तुओं रहे हैं स्मृति उपलब्ध नहीं है, हालांकि आप त्रुटि से निपटने के द्वारा कोड जारी रख सकते हैं एक त्रुटि फेंकता है, लेकिन आपको वर्तमान में बनाए गए ऑब्जेक्ट्स के साथ ही जीवित रहना होगा, या उन लोगों को रिलीज़ या रद्द कर दिया जा सकता है जिनकी आपको आवश्यकता नहीं है।

पुनश्च: लेकिन इसकी नहीं एक सिफारिश की ऐसी त्रुटियों को संभालने और आगे बढ़ना

4

JVM iff (किसी अन्य अपवाद या त्रुटि के साथ) की तरह समाप्त हो जाता है करने के लिए इसे कहीं भी पकड़ा नहीं कर रहा है और वहाँ कोई अन्य धागे कि डेमॉन धागे हैं जिस तरह से।

यह तुरंत समाप्त नहीं होता है क्योंकि OutOfMemoryError पकड़ा जा सकता है और एप्लिकेशन उस गणना को खारिज करने और अन्यथा सामान्य रूप से जारी रखने के लिए त्रुटि को लॉगिंग करने से कुछ त्रुटि प्रबंधन करने का प्रयास कर सकता है।

बाद जोखिम भरा माना जाता है जब कोई त्रुटि किसी भी समस्याओं के बिना होता है लेकिन अक्सर संभव है, के बाद से वस्तुओं का एक बहुत कुछ बिंदु के बीच क्षेत्र से बाहर जा सकते हैं जहां OutOfMemoryError फेंक दिया जाता है और जहां यह पकड़ लिया गया, तब तक को मुक्त कर दिया जा सकता है जो कचरा संग्रह कार्यक्रम के साथ काम करने के लिए नई स्मृति देने के लिए। यदि OutOfMemoryError हुआ क्योंकि एक विशेष गणना के मुकाबले अधिक स्मृति की आवश्यकता है और आवेदन कुछ और बाद में करता है, तो यह ठीक है।

0

आम तौर पर एक जेवीएम केवल समाप्त होता है जब अंतिम गैर-डिमन थ्रेड निकलता है। OutOfMemoryError या किसी अन्य प्रकार की त्रुटि या अपवाद को फेंकने से अंतिम गैर-डिमन थ्रेड मौजूद नहीं हो सकता है यदि यह पकड़ा नहीं जाता है।

हालांकि, अगर त्रुटि पकड़ी जाती है और पुनर्स्थापित नहीं होती है या कोई अन्य गैर-डिमन थ्रेड चल रहा है, तो JVM बाहर नहीं निकलता है। यानी प्रोग्राम को बाहर निकलने के कारण किसी भी विशेष त्रुटि के बारे में कुछ खास नहीं है।

  • System.exit() एक JVM नीचे बंद शुरू करने के लिए कारण होगा और पकड़ा नहीं किया जा सकता दो योग्यता रहे हैं। एकाधिक धागे होने से कोई फर्क नहीं पड़ता।
  • थ्रेडडिथ त्रुटि विशेष है कि यह डिफ़ॉल्ट रूप से मुद्रित नहीं होती है। अन्यथा यह किसी भी अन्य त्रुटि की तरह व्यवहार करता है।