यह काम कर सकता है, लेकिन यह आमतौर पर एक बुरा विचार है। इस बात की कोई गारंटी नहीं है कि आपका आवेदन पुनर्प्राप्त करने में सफल होगा, या यह पता चलेगा कि यह सफल नहीं हुआ है या नहीं। उदाहरण के लिए:
वास्तव नहीं पर्याप्त स्मृति आरक्षित स्मृति के ब्लॉक जारी की तरह वसूली कदम उठाने के बाद भी अनुरोध किया कार्य करने के लिए हो सकता है। इस स्थिति में, आपका एप्लिकेशन एक लूप में फंस सकता है जहां यह बार-बार ठीक होने लगता है और फिर स्मृति से बाहर चला जाता है।
ओओएमई किसी भी धागे पर फेंक दिया जा सकता है। यदि किसी एप्लिकेशन थ्रेड या लाइब्रेरी को इसका सामना करने के लिए डिज़ाइन नहीं किया गया है, तो यह एक अपूर्ण या असंगत स्थिति में कुछ दीर्घकालिक डेटा संरचना छोड़ सकता है।
यदि ओओएमई के परिणामस्वरूप धागे मर जाते हैं, तो एप्लिकेशन को ओओएमई वसूली के हिस्से के रूप में उन्हें पुनरारंभ करने की आवश्यकता हो सकती है। कम से कम, यह एप्लिकेशन को और अधिक जटिल बनाता है।
मान लीजिए कि थ्रेड अधिसूचना/प्रतीक्षा या कुछ उच्च स्तरीय तंत्र का उपयोग करके अन्य धागे के साथ सिंक्रनाइज़ करता है। यदि वह धागा ओओएमई से मर जाता है, तो अन्य धागे को सूचित करने के लिए इंतजार किया जा सकता है (आदि) जो कभी नहीं आते ... उदाहरण के लिए। इसके लिए डिजाइनिंग एप्लिकेशन को और अधिक जटिल बना सकता है।
सारांश में, डिजाइन, लागू करने और OOMEs से उबरने के लिए एक आवेदन पत्र का परीक्षण मुश्किल हो सकता है, खासकर अगर आवेदन (या ढांचा जिसमें यह चलाता है, या पुस्तकालयों का उपयोग करता है के किसी भी) बहु लड़ी है । ओओएमई को घातक त्रुटि के रूप में पेश करना बेहतर विचार है।
एक संबंधित सवाल का यह भी देखें my answer: -:
दूसरे शब्दों में एक OOME (एक आवेदन सर्वर में फेंक दिया जाता है, तो jboss/websphere/
संपादित इस फॉलोअप सवाल के जवाब में ..) क्या मैं को पुनरारंभ करना है?
नहीं, आप को पुनरारंभ नहीं करना है। लेकिन यह शायद बुद्धिमान है, विशेष रूप से यदि आपके पास यह जांचने का एक अच्छा/स्वचालित तरीका नहीं है कि सेवा सही तरीके से चल रही है।
जेवीएम ठीक ठीक हो जाएगा। लेकिन एप्लिकेशन सर्वर और एप्लिकेशन स्वयं इस स्थिति से निपटने के लिए कितनी अच्छी तरह डिजाइन किए गए हैं, इस पर निर्भर करता है कि यह ठीक हो सकता है या नहीं। (मेरा अनुभव यह है कि कुछ ऐप सर्वर इस से निपटने के लिए डिज़ाइन किए गए हैं, और ओओएमई से पुनर्प्राप्त करने के लिए एक जटिल अनुप्रयोग को डिजाइन और कार्यान्वित करना कठिन है, और इसे ठीक से परीक्षण करना भी कठिन है।)
संपादित 2
इस टिप्पणी के जवाब में:
"अन्य थ्रेड छोड़ा जा सकता है सूचनाएं दे इंतजार कर (आदि) कि कभी नहीं आ" वाकई? क्या मारे गए थ्रेड अपने ढेर को खारिज नहीं करेंगे, संसाधनों को जारी करते हुए, जैसे कि ताले लगाएंगे?
हाँ वास्तव में! पर विचार करें इस:
थ्रेड # 1 रन इस:
synchronized(lock) {
while (!someCondition) {
lock.wait();
}
}
// ...
थ्रेड # 2 रन इस: थ्रेड # 1 सूचित पर इंतज़ार कर रहा है, और थ्रेड # 2 एक OOME हो जाता है
synchronized(lock) {
// do stuff
lock.notify();
}
हैं // do something
अनुभाग में, तो थ्रेड # 2 notify()
कॉल नहीं करेगा, और थ्रेड # 1 हमेशा एक अधिसूचना के लिए प्रतीक्षा कर सकता है जो कभी नहीं होगा। निश्चित रूप से, थ्रेड # 2 को lock
ऑब्जेक्ट पर mutex को रिलीज़ करने की गारंटी है ... लेकिन यह पर्याप्त नहीं है!
यदि थ्रेड द्वारा चलाया गया कोड अपवाद सुरक्षित नहीं है, जो एक और सामान्य समस्या है।
"अपवाद सुरक्षित" एक शब्द नहीं है जिसे मैंने सुना है (हालांकि मुझे पता है कि आपका क्या मतलब है)। जावा प्रोग्राम सामान्य रूप से अप्रत्याशित अपवादों के लिए लचीला होने के लिए डिज़ाइन नहीं किए जाते हैं। दरअसल, उपरोक्त की तरह एक परिदृश्य में, यह एप्लिकेशन अपवाद को सुरक्षित बनाने के लिए कहीं मुश्किल और असंभव के बीच होने की संभावना है।
आपको कुछ तंत्र की आवश्यकता होगी जिससे थ्रेड # 1 (ओओएमई के कारण) की विफलता थ्रेड # 2 के लिए एक अंतर-थ्रेड संचार विफलता अधिसूचना में बदल जाती है। Erlang यह करता है ... लेकिन जावा नहीं। Erlang में ऐसा करने का कारण यह है कि Erlang सख्त सीएसपी जैसी प्राइमेटिव का उपयोग करके संचार की प्रक्रिया करता है; यानी डेटा संरचनाओं का कोई साझाकरण नहीं है!
(ध्यान दें आप बस के बारे में कोई अप्रत्याशित अपवाद के लिए ऊपर समस्या हो सकता है कि ... बस Error
अपवाद नहीं। जावा कोड के कुछ प्रकार के होते हैं, जहां एक अप्रत्याशित अपवाद से उबरने का प्रयास कर रहा खत्म होने की संभावना है बुरी तरह से।)
भी http://stackoverflow.com/questions/2679330/catching-java-lang-outofmemoryerror – Raedwald