यह * कभी * ठीक है जावा में StackOverflowError को पकड़ने के लिए?


27

मैं सोचता था कि यह नहीं है, लेकिन कल मुझे यह करना था। यह एक ऐसा अनुप्रयोग है जो अतुल्यकालिक नौकरियों को संसाधित करने के लिए अक्का (जेवीएम के लिए एक अभिनेता प्रणाली कार्यान्वयन) का उपयोग करता है । अभिनेताओं में से एक कुछ पीडीएफ हेरफेर करता है, और क्योंकि पुस्तकालय छोटी गाड़ी है, यह StackOverflowErrorहर अब और फिर मर जाता है ।

दूसरा पहलू यह है कि अगर कोई भी JVM घातक त्रुटि (जैसे StackOverflowError) पकड़ी जाती है तो अक्का को उसके पूरे अभिनेता सिस्टम को बंद करने के लिए कॉन्फ़िगर किया गया है।

तीसरा पहलू यह है कि यह अभिनेता प्रणाली एक वेब ऐप (डब्ल्यूटीएफ-ईश, विरासत, कारणों के लिए) के अंदर एम्बेडेड है, इसलिए जब अभिनेता प्रणाली बंद हो जाती है, तो वेब ऐप नहीं है। शुद्ध प्रभाव यह है कि StackOverflowErrorहमारे नौकरी प्रसंस्करण पर आवेदन सिर्फ एक खाली वेब ऐप बन जाता है।

एक त्वरित सुधार के रूप में मुझे StackOverflowErrorफेंका जा रहा था, ताकि अभिनेता प्रणाली के थ्रेड पूल को फाड़ा न जाए। यह मुझे सोचने के लिए प्रेरित करता है कि शायद कभी-कभी ऐसी त्रुटियों को पकड़ने के लिए ठीक है जैसे विशेष रूप से इस तरह के संदर्भों में? जब थ्रेड पूल में मनमाने कार्य होते हैं? इसके विपरीत, OutOfMemoryErrorमैं कल्पना नहीं कर सकता कि कैसे एक StackOverflowErrorअसंगत स्थिति में आवेदन छोड़ सकता है। इस तरह की त्रुटि के बाद स्टैक साफ हो जाता है, इसलिए गणना सामान्य रूप से चल सकती है। लेकिन शायद मुझे कुछ महत्वपूर्ण याद आ रहा है।

यह भी ध्यान दें कि मैं पहली बार में त्रुटि को ठीक करने के लिए हूं इस तरह की स्थिति उत्पन्न हो सकती है।

बेहतर होगा कि जेवीएम प्रक्रिया को फिर से शुरू करने के बजाय StackOverflowError, उस नौकरी को असफल मानकर अपने व्यवसाय के साथ जारी रखा जाए?

क्या SOEs को कभी नहीं पकड़ने का कोई सम्मोहक कारण है? "सर्वोत्तम प्रथाओं" को छोड़कर, जो एक अस्पष्ट शब्द है जो मुझे कुछ भी नहीं बताता है।


1
जेवीएम पर उपलब्ध स्टैक स्पेस को बढ़ाने के लिए एक अन्य विकल्प होगा
शाफ़्ट फ्रीक

3
@ratchetfreak: StackOverflowException- ढेर अंतरिक्ष तो कोई लाभ के लिए एक नया धागा की स्मृति लागत में वृद्धि होगी बढ़ रही रों आमतौर पर विधि कॉल की एक गैर समाप्त श्रृंखला की वजह से कर रहे हैं।
झोमिनल

1
कम से कम एक SOE वैध था क्योंकि इनपुट बहुत बड़ा था। दुर्भाग्य से, इसे एक पुनरावर्ती कार्यान्वयन (जावा के रेगेक्स इम्प्लांट) के साथ संभालना बहुत अच्छा विचार नहीं था। वैसे भी, जब भी गणना समाप्त करने की गारंटी दी जाती है, तो आप यह नहीं जानते कि नए स्टैक का आकार अन्य गणनाओं के लिए पर्याप्त है या नहीं।
Ionu35 G. स्टेन

2
यह एसटीए के लिए विस्थापित नहीं किया जाना चाहिए ... ओह, रुको ... कोई बात नहीं। :-)
Blrfl

अपनी छोटी गाड़ी लाइब्रेरी के बारे में। आपको वास्तव में उस पीडीएफ हेरफेर फ़ंक्शन को अपनी प्रक्रिया में माइग्रेट करना चाहिए ताकि आप ओएस को इसे मार सकें।
एसेन स्कोव पेडर्सन

जवाबों:


44

एक सामान्य नियम के रूप में, अगर यह बिल्कुल कभी नहीं था, कभी कुछ करने के लिए स्वीकार्य है, और उस बारे में सहमति थी, तो भाषा कार्यान्वयनकर्ताओं ने इसकी अनुमति नहीं दी होगी। लगभग ऐसे सर्वसम्मति से स्पष्ट-कट अधिकतम नहीं हैं। (सौभाग्य से, क्योंकि यही हमें नौकरियों में मानव प्रोग्रामर रखता है!)

यह बहुत अधिक लगता है जैसे कि आपने ऐसी स्थिति पाई है जहां इस त्रुटि को पकड़ना आपके लिए सबसे अच्छा विकल्प है: यह आपके आवेदन को काम करने देता है, जबकि अन्य सभी विकल्प नहीं है, और यही अंत में मायने रखता है। सभी "सर्वोत्तम अभ्यास" बस कई मामलों के साथ लंबे अनुभवों के योग हैं जिन्हें आमतौर पर समय बचाने के लिए एक विशिष्ट मामले के विस्तृत विश्लेषण के स्थान पर उपयोग किया जा सकता है; आपके मामले में, आपने पहले से ही विशिष्ट विश्लेषण किया है और एक अलग परिणाम प्राप्त किया है। बधाई हो, आप स्वतंत्र विचार के लिए सक्षम हैं!

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


3
धन्यवाद। मेरे संदेह से कुछ हद तक पुष्ट होने के बाद मुझे पता चला कि .NET ने StackOverflowExceptionएक नॉन-कैटलेबल अपवाद बनाया है। मुझे पता है, यह एक अलग मंच है, लेकिन मुझे लगा कि उनका एक कारण हो सकता है। इसके अलावा, वस्तु आरंभीकरण के संबंध में अपनी बात पर हाजिर है। इससे मुझे लगता है कि मुझे इस SOE को कुछ अमूर्त परतों के नीचे पकड़ना चाहिए, ताकि मैं "गलत" SOE को पकड़ न सकूं।
इओनु

14
+1: सर्वोत्तम प्रथाओं को हमेशा स्पष्टीकरण के साथ आना चाहिए कि वे क्यों और किस संदर्भ में "सर्वश्रेष्ठ" हैं, ताकि आप यह निर्धारित कर सकें कि वे आपके विशिष्ट मामले पर लागू होते हैं या नहीं।
माइकल बोर्गवर्ड 10

situations hereहोना चाहिए situations where
सेवि

2

मुझे नहीं पता कि यहां कोई जेवीएम-विशिष्ट जोखिम हैं, लेकिन कुल मिलाकर यह काफी समझदार है।

उदाहरण के लिए, पुनरावर्ती एल्गोरिदम हैं, जैसे भोले क्विकॉर्ट्स, जिसमें log(n)एक विशिष्ट मामले में स्टैक गहराई होती है, लेकिन सबसे खराब स्थिति में वे गहराई तक नीचा दिखाते हैं nजो स्टैक को उड़ा सकते हैं।

सबसे खराब स्थिति दुर्लभ है, और अगर आप आंशिक रूप से हल किए गए सेट पर सॉर्ट को फिर से शुरू करते हैं, तो ऐसा दोबारा होने की संभावना नहीं है, इसलिए ऐसा होने पर स्टैक ओवरफ्लो अपवाद को पकड़ने के लिए बहुत कुछ समझ में आता है और त्रुटि को रोकने या मारने से रोकने के बजाय काम को पुनरारंभ करें। पूरा आवेदन।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.