2011-09-08 17 views
7

संभव डुप्लिकेट:
Catching java.lang.OutOfMemoryErrorक्या OutOfMemoryError को कैप्चर करना इतना बुरा विचार है?

OutOfMemoryError हैं: क्योंकि यह स्मृति से बाहर है, और कोई और अधिक

फेंक दिया जब जावा वर्चुअल मशीन एक वस्तु आवंटित नहीं कर सकता स्मृति कचरा कलेक्टर

012 द्वारा उपलब्ध कराया जा सकता है

जावा का कहना है:

कोई त्रुटि फेंकने योग्य का एक उपवर्ग है कि गंभीर समस्याओं इंगित करता है कि एक उचित आवेदन को पकड़ने की कोशिश नहीं करनी चाहिए। ऐसी अधिकांश त्रुटियां असामान्य स्थितियां हैं।

यह सुनवाई की तरह लगता है:

आप डूब रहे हैं, तो उचित होना: यदि आप ऊपर की तरफ पानी के ऊपर अपने सिर रखने के लिए तैरने के लिए कोशिश नहीं करनी चाहिए। मृत्यु आमतौर पर असामान्य स्थितियों से होती है।

चलो एक परिदृश्य की कल्पना करें जहां कोई सेवा चला रहा है। किसी कारण से, एक ही सर्वर पर एक और एप्लीकेशन बहुत मेमोरी खा रहा है, जिससे आपकी सेवा में एक अप्रत्याशित ओओएम हो रहा है। क्या उपयोगकर्ता के लिए उपलब्ध रहने के लिए इस सेवा की स्मृति खपत को कम करने का प्रयास करना इतना बुरा विचार है?

या ओओएम फेंकने के बाद ऐसे समाधान के कार्यान्वयन को रोकने के लिए जेवीएम स्तर पर कुछ और मौलिक हो रहा है?

+0

@aix मैं नाटकीय परिस्थितियों में अभी भी ठीक होने के बावजूद उन्हें ठीक से सहेजने के बावजूद कुछ डेटा संरचनाओं के कुछ संदर्भों को ढीला कर सकता हूं। – JVerstry

+0

@dogbane आपका संदर्भ मेरे प्रश्न का उत्तर नहीं देता है, यह प्रश्न डुप्लिकेट नहीं है। – JVerstry

+0

एक बेहतर सादृश्य होगा: आप एक कार चला रहे हैं जो आग लगती है। जारी रखने और अपने गंतव्य तक पहुंचने का प्रयास न करें। कंधे पर खींचो। – Jim

उत्तर

0

समस्या यह है कि ओओएम एक त्रुटि है जो सामान्य परिस्थितियों में नहीं होनी चाहिए। इसे पकड़कर और स्मृति को रिहा करने की कोशिश करके, आप किसी अन्य प्रकार के रिसाव या अनजान व्यवहार को कहीं और अस्पष्ट कर रहे हैं।

यदि आपको ओओएम मिलता है, तो शायद ऐसा इसलिए है क्योंकि आपने अधिक स्मृति का उपयोग करने के लिए JVM को कॉन्फ़िगर नहीं किया है।

+0

सहमत हुए, लेकिन मैं स्मृति जारी करने और जीसी को कॉल करने के बाद उस मुद्दे को लॉग कर सकता था। यह असम्भव नहीं है। – JVerstry

+1

यदि आप इसे ठीक कर सकते हैं, और आप जानते हैं कि त्रुटि क्यों हुई और यह वैध था तो हर तरह से ऐसा करें। लेकिन ज्यादातर समय, जब आप ओओएम प्राप्त करते हैं तो आपको पता नहीं चलेगा और इसे पुनर्प्राप्त करना बहुत मुश्किल होगा क्योंकि आप पाएंगे कि आप अपने वीएम मेमोरी से बाहर होने के बाद क्या कर सकते हैं। –

3

आप उद्धृत

फेंक दिया जब जावा वर्चुअल मशीन एक वस्तु क्योंकि यह स्मृति से बाहर है आवंटित नहीं कर सकता है, और कोई अधिक स्मृति उपलब्ध कराया जा सकता है कचरा कलेक्टर द्वारा

उस समय आप खराब हो गए हैं। उस वर्णन का तात्पर्य है कि जावा/जेवीएम को संचालित करने के लिए पर्याप्त संसाधन नहीं मिल सकते हैं, और यदि यह सत्य है, तो समस्या को ठीक करने के लिए अधिक जावा कोड निष्पादित करना समस्याग्रस्त हो जाएगा।

एक अच्छी सादृश्य यह है कि आपकी कार गैस से बाहर हो गई है, और आप त्वरक पर कदम उठाकर इसे ठीक करना चाहते हैं।

एक बेहतर समाधान क्षमता की योजना है और बनाने के लिए है सुनिश्चित करें

1) आपके सर्वर को अपनी नौकरी
2) सेवाओं अपने सर्वर पर चल कल्पना के भीतर करते हैं और अधिक से अधिक उपभोग नहीं करते करने के लिए पर्याप्त स्मृति संसाधनों की एक निश्चित राशि।

+0

"JVM अब सही ढंग से चल रहा है" या संसाधनों को ठीक से चलाने के लिए नहीं है? – JVerstry

+0

वास्तव में दूसरा, मेरा जवाब संपादित किया। – hvgotcodes

+0

मैं यही सोच रहा हूं, इसलिए, यह दिन को बचाने की कोशिश करने के लिए पूरी तरह से असंभव या अनुचित नहीं होगा। – JVerstry

-1

यह एक बुरा विचार है। मुख्य रूप से क्योंकि OutOfMemoryErrorErrorException नहीं है - एक त्रुटि "गंभीर मुद्दों को इंगित करती है कि एक उचित अनुप्रयोग को पकड़ने की कोशिश नहीं करनी चाहिए।"

इसके बजाय, अपने संभव परिदृश्यों का विश्लेषण करते हैं और इस PDF

+1

पर कदम नहीं, ठीक है, लेकिन यदि आप दुर्घटना से बचने के लिए विमान उड़ान भर सकते हैं तो क्या अधिक गैस डालना होगा? क्या ऐसा करने का कोई कारण नहीं है? यह मेरा सवाल है ... – JVerstry

+0

मैन, क्या एक समानता है! तो एक विमान दुर्घटना कुछ शर्त के कारण होती है कि अधिकांश समय मानव नियंत्रण से बाहर है। इसके लिए, आपातकालीन प्रक्रियाओं को परिभाषित किया गया है ताकि अभी भी कुछ आत्माओं को बचाया जा सके। इसी तरह एक आवेदन में प्रारंभिक चेतावनी होनी चाहिए यदि यह महत्वपूर्ण है और उसे पुनर्प्राप्ति प्रक्रिया होनी चाहिए - यदि उचित हो। यदि आप 'आउटऑफमेमरी एरर' पकड़ने के लिए बाहर हैं, तो आप इसे पकड़ लेंगे? और अधिकांश समय जब आप इसे पकड़ते हैं, तो आप इसके बारे में कुछ भी नहीं कर सकते हैं। मध्य अटलांटिक में दुर्घटनाग्रस्त विमान की तरह, यहां तक ​​कि यदि आपके पास पैराशूट था तो जीवित रहने की संभावना 0 –

-1

यह बेकार है में उपलब्ध कराई गई जानकारी के आधार पर फिक्स लागू होते हैं। क्योंकि फिलहाल त्रुटि पकड़ ली जाती है, आप ढेर स्मृति की इतनी कम हो सकती है कि कोई भी नई ऑब्जेक्ट सृजन एक नया ओओएमई फेंक सकता है। पकड़ में घुसपैठ के इस तरह के एक छोटे से मार्जिन होने का मतलब है कि आप केवल एक ही कार्रवाई बाहर निकलना है।

टेस्ट इस स्निपेट, और मुझे बताओ कि क्या अपने उत्पादन होता है:

 import java.util.LinkedList; 
     import java.util.List; 

     public class OOMErrorTest { 


     public static void main(String[] args) { 
      List<Long> ll = new LinkedList<Long>(); 

      try { 
       long l = 0; 
       while(true){ 
        ll.add(new Long(l++)); 
       } 
      } catch(OutOfMemoryError oome){   
       System.out.println("Error catched!!"); 
       System.out.println("size:" +ll.size()); 
      } 
      System.out.println("Test finished"); 
     } 

     } 

लेकिन सख्ती से बोला, हाँ, इन catchable हैं।

+0

ठीक से विघटित होने का क्या मतलब है? – JVerstry

+0

मेरा मतलब उड़ रहा है। –

+1

आप http://stackoverflow.com/questions/2679330/catching-java-lang-outofmemoryerror जांच सकते हैं तो – JVerstry

-1

आप वास्तव में ओओएम से ठीक नहीं हो सकते हैं।

हालांकि कुछ भी कोशिश करने और पकड़ने का एक कारण है - "कैच-फेंकने योग्य" गुट ने मुझे बताया कि जब हमने एक परियोजना में ठीक से काम किया था, तो मैं ऐसा नहीं कर रहा था - यह एक कारण है: क्या हुआ यह लॉग करने का प्रयास करें। क्योंकि अगर आपको नहीं पता कि क्या हुआ यह पता लगाना मुश्किल है कि सॉफ़्टवेयर को बैक अप और चलाने के तरीके को कैसे प्राप्त किया जाए।

एक कारण भी एक बड़ा "लेकिन" है: यह आमतौर पर काम नहीं करेगा।

त्रुटियां आमतौर पर आपके चल रहे कोड के भीतर से तय नहीं की जा सकती हैं, यही कारण है कि वह अंतर है।