malloc
0 या नए थ्रो अपवाद को वापस करने पर आप क्या करते हैं ? बस रुकें या OOM स्थिति से बचने की कोशिश करें / उपयोगकर्ता के काम को बचाएं?
malloc
0 या नए थ्रो अपवाद को वापस करने पर आप क्या करते हैं ? बस रुकें या OOM स्थिति से बचने की कोशिश करें / उपयोगकर्ता के काम को बचाएं?
जवाबों:
मैं एक दुर्घटना से बचने की तरह OOM से बचना चाहता हूँ।
काम का एक बड़ा हिस्सा करने से बचें (और एक ही बार में मेमोरी का बड़ा हिस्सा आवंटित करें)। डेटा को डिस्क पर रखें, OS डिस्क कैश पर भरोसा करें और जितना संभव हो मेमोरी-मैप्ड IO का उपयोग करें, और केवल एक समय में डेटा के एक छोटे हिस्से पर काम करें। यदि बड़ी मात्रा में डेटा को ऑन-लाइन (कम विलंबता के साथ परोसा जाना) चाहिए, तो उन्हें कई मशीनों में मेमोरी में रखें, जैसे सभी बड़ी सर्च इंजन कंपनियां करती हैं। या एक SSD खरीदें।
इस सवाल का जवाब देने वाले ज्यादातर लोगों ने शायद एम्बेडेड सिस्टम पर कभी काम नहीं किया है, जहां मॉलोक 0 वापस आना एक बहुत ही वास्तविक संभावना है। वर्तमान में मैं जिस सिस्टम पर काम कर रहा हूं, उस पर कुल 4.25K बाइट्स RAM (कि 4352 बाइट्स) है। मैं स्टैक के लिए 64 बाइट्स आवंटित कर रहा हूं, और वर्तमान में 1600 बाइट ढेर है। कल ही मैं एक हीप वॉक रूटीन पर डिबगिंग कर रहा था ताकि स्मृति के आवंटन और फ्रीजिंग का पालन कर सकूं। हीप वॉक एक सीरियल पोर्ट के आउटपुट के लिए एक छोटी (30 बाइट) स्टैटिकली आवंटित बफर का उपयोग करता है। इसे रिलीज़ संस्करण के लिए बंद कर दिया जाएगा।
चूँकि यह एक उपभोक्ता उत्पाद है, इसलिए यह बेहतर है कि उत्पाद को जारी किए जाने के बाद मेमोरी से बाहर न चलाएं। मुझे यकीन है कि यह विकास के दौरान होगा। किसी भी मामले में, मैं जो कर सकता हूं, वह स्पीकर को एक-दो बार बीप कर सकता है, और रीबूट को बाध्य करता है।
पूरी तरह से ईमानदार होने के लिए, सभी परियोजनाओं में मैंने किया है (ध्यान रखें कि मैं अभी तक कहीं भी काम नहीं कर रहा हूं), मैंने कभी नहीं सोचा था कि ऐसा हो सकता है, और इस तरह मुझे लगता है कि मेरे कार्यक्रम बहुत तेजी से मौत मर जाएंगे।
इसके अलावा, ओओएम को संभालने के लिए आपको त्रुटि संदेश प्रदर्शित करने या सब कुछ बचाने के लिए संसाधनों का प्रचार करने की आवश्यकता होती है, जो कि असुविधाजनक हो सकता है।
मुझे लगता है कि इन दिनों, मूंगफली की तुलना में स्मृति कम है, यह ऐसा कुछ नहीं है जो अक्सर होना चाहिए। संरक्षित स्मृति की सुबह और उससे पहले, शायद यह एक चिंता का विषय था, लेकिन अब? केवल OOM त्रुटियां जो मैंने देखी हैं, वे बग कोड से थीं।
वैसे भी मॉलॉक रिटर्न कोड की जाँच करना बेकार है।
आधुनिक ऑपरेटिंग सिस्टम मेमोरी को ओवरकम करते हैं: वे प्रक्रियाओं को वास्तव में उपलब्ध होने की तुलना में अधिक मेमोरी देते हैं। आपके द्वारा दी गई मेमोरी वर्चुअल है, सभी को एक सिंगल-शून्य पृष्ठ से मैप किया गया है।
यह तब तक नहीं है जब तक आप स्मृति को नहीं लिखते हैं कि आपकी प्रक्रियाओं के लिए एक भौतिक, अद्वितीय, पृष्ठ आवंटित किया गया है। यदि यह आबंटन विफल रहता है, तो कर्नेल मेमोरी खोजने के प्रयास में एक प्रक्रिया (शायद आपकी!) को समाप्त कर देगा। उस बिंदु पर आप कुछ भी नहीं कर सकते।
जब तक आप एम्बेडेड सिस्टम, रियल-टाइम सिस्टम या सिस्टम के लिए विकसित नहीं कर रहे हैं, तब तक यह बहुत महत्वपूर्ण है कि विफलताओं में जीवन या अरबों डॉलर खर्च हो सकते हैं ... तब स्मृति स्थितियों से बाहर निकलने के बारे में चिंता करने के लिए यह आर्थिक रूप से लायक नहीं है।
ज्यादातर मामलों में, ऐसा बहुत कम होता है जब आप किसी भी तरह की मेमोरी से बाहर होते हैं, क्योंकि कोई भी नई वस्तु बनाने या कोई भी कार्य करने के लिए कोई मेमोरी नहीं होती है। आपको ओओएम को संभालने वाले ऐप की लागत का वजन करना होगा जो लाभ आपको इसे करने से मिलता है।
मैं हमेशा त्रुटि के लिए जाँच करूँगा। यदि कुछ त्रुटि स्थिति में लौटता है, तो इसे आपके कार्यक्रम द्वारा नियंत्रित किया जाना चाहिए। यहां तक कि अगर यह एक संदेश है जो कहता है "आउट ऑफ़ मेमोरी, गॉट्टा गो!", यह "एक्सेस उल्लंघन", "कोर डंप", या जो भी हो, से बेहतर है। एक एक त्रुटि स्थिति है जिसे आप संभालते हैं, दूसरा एक बग है। और उपयोगकर्ता इसे ऐसे ही अनुभव करेगा।
अपने विशिष्ट मामले के लिए, आप ऑपरेशन को वापस करने की कोशिश कर सकते हैं, संसाधनों को मुक्त कर सकते हैं जो आपको विफलता के बिंदु तक पहुंचने, त्रुटि की रिपोर्ट करने और निष्पादन को जारी रखने तक आवंटित किए गए हैं (हो सकता है कि जब आप आवेदन छोड़ने की कोशिश कर रहे हों, तो आप दे सकते हैं तुरंत बाहर निकलने का विकल्प)। इस तरह, उपयोगकर्ता यह तय कर सकता है कि क्या करना है, या फाइलों को बंद करने के साथ-साथ कुछ मेमोरी को खाली करने की कोशिश करना है, निश्चित रूप से, आप कैसे स्थिति को संभाल सकते हैं यह आपके प्रोग्राम पर अत्यधिक निर्भर है - एक ऐसा कार्यक्रम जो माना नहीं जाता है संवादात्मक हो सकता है कि बस त्रुटि को लॉग इन करें और या तो छोड़ दें, या जारी रखें।