2011-09-30 10 views
6

के मामले में जावा प्रक्रिया का व्यवहार OutOfMemoryError प्राप्त करने पर जावा प्रोग्राम का व्यवहार क्या होगा। क्या कोई परिभाषित व्यवहार है? क्या प्रक्रिया दुर्घटनाग्रस्त हो जाएगी या क्या यह प्रतीक्षा/नींद की स्थिति में जाएगी?OutOfMemoryError

अद्यतन: अगर मैं इसे अपने कोड में नहीं रख रहा हूं?

+0

ओओएम त्रुटि के साथ सोते हुए क्या फायदे होंगे? –

उत्तर

12

और OutOfMemoryError किसी अन्य अपवाद की तरह नियंत्रित किया जाता है:

  • यह पकड़ा जाता है, तो ज्यादा कुछ नहीं होता है।
  • यदि यह पकड़ा नहीं गया है, तो threads या threads groups बेजोड़ अपवाद हैंडलर इसे संभालता है। यह बहुत हमेशा धागा बंद होने की ओर जाता है।

    • OutOfMemoryError एक Error, न कि किसी Exception है:

    हालांकि दो कारक है कि वास्तव में वहाँ अन्य अपवाद में नहीं हैं देखते हैं। इसका मतलब यह है कि कहीं भी पकड़े जाने के लिए बहुत ही असंभव है: आपको आमतौर पर Error को पकड़ने की कोशिश नहीं करनी चाहिए (बहुत कम अपवादों के साथ) और यह आमतौर पर नहीं किया जाता है, इसलिए इसे संभालने की संभावना कम होती है।

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

और धागा अगर यह करने के लिए होता केवल गैर डेमॉन धागा है (अक्सर, लेकिन जरूरी नहीं कि, कि मुख्य थ्रेड, कि main विधि कार्यान्वित है), तो वह धागा पूरे JVM बंद में मारे गए परिणाम मिल नीचे (जिसे अक्सर "दुर्घटना" के रूप में माना जाता है)।

तो tl; डॉ है: यह शायद धागा मार देंगे, और यदि स्मृति-समस्या हल हो जाती है, तो यह अधिक से अधिक धागे को भी हो सकता है।

+0

"केवल गैर-डिमन थ्रेड" के लिए +1 है, हालांकि मुझे लगता है कि मुख्य थ्रेड किसी भी मामले में जल्द ही बाद में 'आउटऑफमेमरी एरर' पर बर्बाद होने की संभावना है। – Raedwald

+1

@ रेडवाल्ड: जो आसानी से हो सकता है, लेकिन इस मामले की आवश्यकता नहीं है: कभी-कभी स्टैक की अनियंत्रण जीसी के लिए पर्याप्त वस्तु को योग्य बनाता है कि स्मृति स्थिति से बाहर अकेले हल हो जाता है।उदाहरण के लिए यदि ओओएम-त्रुटि के कारण डेटा का एक बड़ा आयात विफल हो जाता है, तो ऐसा हो सकता है कि शेष एप्लिकेशन अप्रभावित रूप से जारी रहे (लेकिन आपको दुर्भाग्य हो सकता है और पहले किसी अन्य भाग में ओओएम-त्रुटि प्राप्त हो सकती है)। –

+0

अच्छा बिंदु। एक बहु थ्रेडेड सर्वर के लिए, आप वास्तव में उस व्यवहार को चाहते हैं, इसलिए सर्वर को मारने के बजाए एक बड़ा अनुरोध स्वयं ही करता है। – Raedwald

1

आउटऑफमेमरी त्रुटि होने पर आप प्रोग्राम की स्थिति निर्धारित नहीं कर सकते हैं। यदि आप थ्रोबल को पकड़ नहीं रहे हैं तो आपका प्रोग्राम स्टैकट्रैक से समाप्त हो जाएगा। भले ही आप थ्रोबल को पकड़ रहे हों, आपको सिस्टम.एक्सिट को कॉल करना चाहिए क्योंकि इससे पुनर्प्राप्त करने में कोई बात नहीं है। "त्रुटि" आम तौर पर अपवाद का विरोध करने के रूप में, JVM द्वारा फेंक दिया जाता है, जो एप्लिकेशन/प्रोग्रामर विशिष्ट है।

1

OutOfMemoryError को अप्राप्य माना जाना चाहिए और ऐसी त्रुटि के बाद JVM का व्यवहार अपरिभाषित है, इसलिए इसे संभालने के प्रयास में कोई मतलब नहीं है। इस अपवाद के बाद किए गए किसी भी ऑपरेशन को JVM द्वारा फेंक दिया जाएगा अपरिभाषित व्यवहार होगा। वे निष्पादित कर सकते हैं, लेकिन अधिक संभावना है कि वे सिर्फ एक और त्रुटि फेंक दी जाएगी।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^