2009-12-11 10 views
8

मेरे पास जावा वेब एप्लिकेशन में एक थ्रेड है जो java.lang.OutOfMemoryError: जावा हीप स्पेस अपवाद का कारण बनता है, लेकिन कोशिश/पकड़ ब्लॉक में त्रुटि नहीं होती है।क्यों "java.lang.OutOfMemoryError: जावा हीप स्पेस" पकड़ा नहीं गया है?

नमूना कोड:

private void doSomeWork() 
{ 
    try 
    { 
     processData(); //Causes OutOfMemoryError 
     System.out.println("This line does not execute"); 
    } 
    catch (Exception e) 
    { 
     System.out.println("Exception. This line does not execute."); 
     //Log error 
    } 
    finally 
    { 
     System.out.println("finally. This line does execute"); 
     System.out.println("Thread name: " + Thread.currentThread().getName()); 

    } 
} 

आउटपुट:

 
finally. This line does execute 
Thread name: _Worker-8 
Exception in thread "_Worker-8" java.lang.OutOfMemoryError: Java heap space 
...

पृष्ठभूमि:

मैं हाल ही में इस जावा परियोजना पदभार संभाल लिया है और मैं उठना कोशिश कर रहा हूँ जावा और इस परियोजना के साथ गति करने के लिए। मैं एक सी # डेवलपर हूं, इसलिए मैं इस परियोजना या जावा से अभी तक परिचित नहीं हूं। मुझे पता है कि मैं -Xmx सेटिंग का उपयोग कर त्रुटि को ठीक कर सकता हूं, लेकिन मुझे इस त्रुटि को पकड़ने में दिलचस्पी है इसलिए मैं इसे लॉग कर सकता हूं। त्रुटि किसी भी लॉग फ़ाइल में दिखाई नहीं दे रही है, और आउटपुट को ग्रहण में डीबग मोड में कंसोल में दिखाया जा रहा है।

उत्तर

39

क्योंकि OutOfMemoryErrorError है, Exception नहीं है। चूंकि OutOfMemoryErrorException का उप-वर्ग नहीं है, catch (Exception e) लागू नहीं होता है।

OutOfMemoryErrorThrowable का विस्तार करता है, इसलिए, आप इसे पकड़ने में सक्षम होना चाहिए। यहां SO discussion है जब (यदि कभी) आपको त्रुटियों को पकड़ना चाहिए। आम तौर पर, चूंकि आप इसके बारे में कुछ नहीं कर सकते हैं, इसलिए सिफारिश है कि उत्पादन कोड में त्रुटियों को पकड़ने से परेशान न हो। लेकिन एक विशेष मामला दिया गया है जहां आप क्या चल रहा है डीबग करने की कोशिश कर रहे हैं, यह सहायक हो सकता है।

+0

लिंक संदर्भों के साथ अच्छा जवाब। मैं इसकी सराहना करता हूं, धन्यवाद! – Crispy

+2

मैं आपके आवेदन के सबसे बाहरी भाग (या थ्रेड विधि के सबसे बाहरी हिस्से में) में फेंकने को पकड़ने की सलाह दूंगा ताकि आप वास्तव में जान सकें कि आपका प्रोग्राम निरस्त क्यों हुआ है (यदि कोई और नहीं है जो आपके लिए ऐसा करने जा रहा है)। –

3

एक "~ त्रुटि" एक "~ अपवाद" नहीं है।

आप को पकड़ने के लिए "त्रुटि" या "फेंकने योग्य"

2

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

+0

अधिक सटीक होने के लिए, OutOfMemoryError वर्चुअलमैचिनररर को बढ़ाता है, जो त्रुटि को बढ़ाता है, और चूंकि त्रुटियां अपवाद नहीं हैं, इसलिए एक पकड़ (अपवाद) इसे – chburd

+0

बिंगो नहीं पकड़ सकता है। पूरे पेड़ को सूचीबद्ध करने के लिए सोचा लेकिन आलसी हो गया :) – Daniil

11

java.lang.OutOfMemoryError java.lang को नहीं बढ़ाता है। अपवाद इसलिए यह अपवाद नहीं है। OutOfMemoryError java.lang.Error फैलाता है। आप को पकड़ने के लिए चाहते हैं, तो त्रुटि इस प्रयास करें:

private void doSomeWork() 
{ 
    try 
    { 
     processData(); //Causes OutOfMemoryError 
     System.out.println("This line does not execute"); 
    } 
    catch (Error e) 
    { 
     System.out.println("Exception. This line does not execute."); 
     //Log error 
    } 
    finally 
    { 
     System.out.println("finally. This line does execute"); 
     System.out.println("Thread name: " + Thread.currentThread().getName()); 

    } 
} 

नोट: अपवाद और त्रुटि फेंकने योग्य फैली तो आप आप भी दोनों को पकड़ने के लिए फेंकने योग्य उपयोग कर सकते हैं।

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html

0

क्या मैं आमतौर पर करते हैं एक 'UncaughtExceptionHandler' एक धागा ताकि आप से कुछ भी लीक कम से कम इस मुद्दे को लॉग इन करने और हो सकता है कुछ सफाई कर का मौका है अगर जोड़ने है जाएगा।