2012-01-04 13 views
12

मैं सी ++ से जावा पर आया हूं। सी ++ दुनिया में हम अपवाद सुरक्षा पर ध्यान देते हैं, और ध्यान दें कि म्यूटेटर म्यूटेटर द्वारा फेंकने वाले अपवादों के सामने अलग-अलग गारंटी प्रदान कर सकते हैं या एक विधि जो इसे प्रस्तुत करता है (न्यूनतम, मजबूत, नो-थ्रो)। एक मजबूत अपवाद गारंटी के लिए एक विधि को कार्यान्वित करने की आवश्यकता है कि कुछ बुनियादी परिचालनों को कभी भी अपवाद फेंकने की गारंटी नहीं दी जाती है। जेएलएस इस बारे में बयान देता है कि कौन से ऑपरेशन किस प्रकार के अपवाद फेंक सकते हैं, लेकिन VirtualMachineError त्रुटि एक समस्या प्रस्तुत करती है। Quoth JLS:नो-फेंक वर्चुअलमैचिनरर गारंटी

एक आंतरिक त्रुटि या संसाधन सीमा जावा भाषा प्रोग्रामिंग के शब्दों को लागू करने से जावा आभासी मशीन रोकता है, इस मामले में, VirtualMachineError के उप-वर्ग का एक उदाहरण फेंक दिया गया है।

जेएलएस VirtualMachineError के बारे में और नहीं कहता है। एक "आंतरिक त्रुटि" का अर्थ JVM में एक बग है, इसलिए मुझे उस मामले में कोई दिलचस्पी नहीं है: JVM में बग के चेहरे में, सभी दांव बंद हैं। लेकिन "संसाधन सीमा" मामले के बारे में क्या? क्या कोई ऐसा ऑपरेशन है जो किसी संसाधन सीमा के कारण विफल होने की गारंटी नहीं देता है?

+0

किसी उत्तर की सबसे नज़दीकी चीज़ 'कोशिश {...} पकड़ (थ्रोबल टी) {} 'होगी। बेशक अगर स्मृति समाप्त हो जाती है तो कोई भी निरंतरता लगभग असंभव साबित होगी। अब यह सी ++ में अलग नहीं है। –

+2

मैं अपने स्वयं के प्रश्न का उत्तर दे रहा हूं। अक्सर पूछे जाने वाले प्रश्न भी इसका सहारा लेते हैं। – Raedwald

उत्तर

12
Java Virtual Machine Specification Quoth

:

इस विनिर्देशन जहां आंतरिक त्रुटि या संसाधन सीमाओं का सामना करना पड़ा हो सकता है अनुमान नहीं लगा सकते और ठीक जनादेश नहीं है जब वे भेजी जा सके। इस प्रकार, VirtualMachineError उपवर्गों नीचे परिभाषित के किसी भी जावा आभासी मशीन के संचालन के दौरान किसी भी समय फेंक दिया जा सकता है:

जावा में इसलिए कोई अपवाद नहीं गारंटी देता है VirtualMachineError अपवाद के संबंध में बनाया जा सकता है। सभी अपवाद गारंटी योग्यता के अधीन होनी चाहिए "... लेकिन यदि VirtualMachineError फेंक दिया गया है"। यह उन तरीकों में से एक है जिसमें जावा सी ++ से अलग है।

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

+0

क्या आप अपने स्वयं के प्रश्न का उत्तर दे रहे हैं, या बस इसे जोड़ रहे हैं? – skaffman

+1

मैं अपने स्वयं के प्रश्न का उत्तर दे रहा हूं। – Raedwald

+0

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

1

यदि यह संसाधन सीमा है, तो पहले स्थान पर, कोई संचालन नहीं होता है। VirtualMachineError होने के लिए यहां सही उदाहरण के लिए लिंक है। Virtual machine error

यह त्रुटि OutofMemoryError की तरह कुछ नहीं है, जहां तक ​​कुछ ऑपरेशन प्रगति पर हो सकते हैं।

+0

" कोई संचालन नहीं होता है "। वह "मजबूत सिंटिनो गारंटी" होगा। लेकिन ऐसी कोई गारंटी नहीं दी गई है। – Raedwald

+0

यदि मेरी व्याख्या सही है, तो ऊपर दिए गए उदाहरण के आधार पर, वीएम शुरू होने से पहले, यह -एक्सएमएक्स पैरामीटर जैसे परिभाषित संसाधनों की जांच कर रहा था और इसे स्मृति के परिभाषित आकार और त्रुटि फेंक नहीं पाया जा सका। मैं आपके बिंदु से सहमत नहीं हूं, लेकिन मुझे नहीं पता कि क्यों। – kosa

1

मुझे लगता है कि आपने अपने स्वयं के प्रश्न का उत्तर दिया है और मैं समझ सकता हूं कि यह सख्त सी ++ पृष्ठभूमि से आने से आपके लिए हल्के आश्चर्यजनक क्यों होगा। यह केवल प्रबंधित स्मृति (आभासी) मशीनों की वास्तविकता है और यह सिर्फ जावा तक ही सीमित नहीं है। मेमोरी समाप्त हो सकती है, क्योंकि जेवीएम कितना ढेर है इसका उपयोग कर सकते हैं (जावा कमांड लाइन पर कॉन्फ़िगर करने योग्य)।

सी ++/मशीन-कोड दुनिया में कुछ हद तक समान, लेकिन समतुल्य नहीं, एक GENERAL_PROTECTION_FAULT (या SEGMENTATION_FAULT यदि आप * NIX पर हैं) तो आपको स्मृति आवंटित करने का प्रयास करने पर प्राप्त होगा जो आवंटित नहीं किया गया है या है अपने वर्चुअल एड्रेस स्पेस के बाहर।उस परिदृश्य के चेहरे में "मजबूत अपवाद गारंटी" प्रदान करना उतना ही मुश्किल है क्योंकि कारण या तो कोड में या प्रोग्राम के नियंत्रण से बाहर पूरी तरह से एक बग हो सकता है।

+0

एक एसईजीवी कार्यक्रम में एक बग इंगित करता है। जावा में इसका समानता 'NullPointerException' है। – Raedwald

+0

मुझे नहीं लगता कि यह एक प्रबंधित वर्चुअल मशीन की एक सामान्य विशेषता है। जब आप 'नई' का उपयोग नहीं कर रहे हैं या कक्षा को लोड करने का प्रयास नहीं कर रहे हैं, तब भी JVMS 'OutOfMemoryError' को फेंकने की अनुमति देता है। – Raedwald

+0

@ रेडवाल्ड जब आप 'शून्य' संदर्भित करने का प्रयास करेंगे तो आपको केवल एनपीई मिलेगा। आप केवल अधिक स्मृति आवंटित करने का प्रयास करने के बाद आउटऑफमेमरी त्रुटि प्राप्त करेंगे (या आप एक विधि को कॉल करते हैं) और जीसी चला है और पर्याप्त स्मृति मुक्त नहीं है। –

0

जावा में, आप किसी भी समय Thread.stop() या रोक (थ्रोबल) पर कॉल कर सकते हैं। अधिकांश त्रुटियों को इतना महत्वपूर्ण माना जाता है कि आपको उन्हें संभालने की कोशिश नहीं करनी चाहिए जबतक कि आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं।

12 साल तक सर्वर साइड जावा एप्लिकेशन विकसित करने के बाद, मैं कह सकता हूं कि मैंने कभी भी यादृच्छिक अपवादों को फेंकने के बारे में चिंता करने वाले किसी के बारे में कभी नहीं सुना है। मुझे संदेह है कि यह सिर्फ एक मुद्दा नहीं है जिसे आपको जावा के बारे में चिंता करने की ज़रूरत है।

क्या आप एक उदाहरण दे सकते हैं कि आपको विश्वास क्यों है कि आपको गारंटी की आवश्यकता है, क्योंकि समस्या को हल करने का एक और तरीका होने की संभावना है?

+2

'आउटऑफमेमरी एरर' अपवाद सबसे दिलचस्प मामला है। जैसा कि मैंने अपने उत्तर में कहा है: दुर्भाग्यपूर्ण, क्योंकि यदि कई कार्यों में से एक विफल रहता है क्योंकि इसे बहुत अधिक स्मृति की आवश्यकता है तो हम अन्य कार्यों के साथ जारी रखना चाहेंगे। लेकिन यदि JVM 'आउटऑफमेमरी एरर' फेंक सकता है, तो हम 'आउटऑफमेमरी एरर' को पकड़ते समय हमारे प्रोग्राम को वैध स्थिति में भरोसा नहीं कर सकते हैं। यह एक कोशिश-पकड़-त्याग दृष्टिकोण अविश्वसनीय बनाता है। – Raedwald

+0

"उन्हें संभालने का प्रयास करें" से पहले "नहीं" गायब जोड़ा गया। –

+2

@ रेडवाल्ड आप सही हैं कि ओओएमई को छोड़ना अविश्वसनीय है।आपको जो करना है वह अधिकतम मेमोरी को परिभाषित करना है जिस पर आप पूरी JVM विफल होने की उम्मीद करेंगे (केवल एक नरम सीमा नहीं) और संचालन करने से बचें जो विफल हो सकती हैं क्योंकि आपको पता नहीं है कि वे कितनी मेमोरी का उपयोग करते हैं। बदतर मामले में, आपको एक अलग प्रक्रिया का उपयोग करने की आवश्यकता है जिसे आवश्यकतानुसार फिर से शुरू किया जा सकता है। (यह जेएनआई पुस्तकालयों में बग के खिलाफ भी सुरक्षा करता है) –

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