मैं अभी भी इस बारे में बहुत अनिश्चित हूँ। मैं एक अनुप्रयोग सर्वर पर 7 साल से काम कर रहा हूँ। हमारे बड़े इंस्टॉलेशन 24 जीबी रैम का उपयोग करते हैं। इसके हाइटली मल्टीथ्रेड, और GC.Collect () के लिए सभी कॉल वास्तव में भयानक प्रदर्शन मुद्दों में भाग गए।
कई थर्ड पार्टी कंपोनेंट्स ने GC.Collect () का इस्तेमाल किया जब उन्हें लगा कि यह इस समय करना सही है। इसलिए एक्सेल-रिपोर्ट्स के एक सरल समूह ने ऐप सर्वर को एक मिनट में कई बार सभी थ्रेड्स के लिए ब्लॉक कर दिया।
हमें GC.Collect () कॉल को हटाने के लिए सभी 3rd पार्टी कंपोनेंट्स को रिफलेक्टर करना था और ऐसा करने के बाद सभी ने ठीक काम किया।
लेकिन मैं Win32 पर भी सर्वर चला रहा हूं, और यहां मैंने OutOfMemoryException प्राप्त करने के बाद GC.Collect () का भारी उपयोग करना शुरू कर दिया।
लेकिन मैं इस बारे में बहुत अनिश्चित हूं, क्योंकि मैंने अक्सर देखा, जब मुझे 32 बिट पर एक ओओएम मिलता है, और मैं फिर से एक ही ऑपरेशन को चलाने के लिए फिर से प्रयास करता हूं, बिना GC.Collect () बुलाए, यह ठीक काम करता है।
एक बात मुझे आश्चर्य है कि ओओएम अपवाद ही है ... अगर मैंने .Net फ्रेमवर्क लिखा होगा, और मैं मेमोरी ब्लॉक आवंटित नहीं कर सकता, तो मैं GC.Collect (), डीफ़्रैग मेमोरी (??) का उपयोग करूँगा, फिर से कोशिश करूँगा। , और अगर मैं अभी भी एक मुफ्त मेमोरी ब्लॉक नहीं पा रहा हूं, तो मैं OOM- अपवाद को फेंक दूंगा।
या कम से कम इस व्यवहार को विन्यास योग्य विकल्प के रूप में बनाते हैं, GC.Collect के साथ प्रदर्शन के मुद्दे की कमियां।
अब मेरे पास इस तरह के बहुत सारे कोड हैं जो समस्या को "हल" करने के लिए मेरे ऐप में हैं:
public static TResult ExecuteOOMAware<T1, T2, TResult>(Func<T1,T2 ,TResult> func, T1 a1, T2 a2)
{
int oomCounter = 0;
int maxOOMRetries = 10;
do
{
try
{
return func(a1, a2);
}
catch (OutOfMemoryException)
{
oomCounter++;
if (maxOOMRetries > 10)
{
throw;
}
else
{
Log.Info("OutOfMemory-Exception caught, Trying to fix. Counter: " + oomCounter.ToString());
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(oomCounter * 10));
GC.Collect();
}
}
} while (oomCounter < maxOOMRetries);
// never gets hitted.
return default(TResult);
}
(ध्यान दें कि Thread.Sleep () व्यवहार वास्तव में एक एपिक व्यवहार है, क्योंकि हम ORM कैशिंग सेवा चला रहे हैं, और सेवा को सभी कैश्ड ऑब्जेक्ट को रिलीज़ करने में कुछ समय लगता है, अगर RAM कुछ पूर्वनिर्धारित मानों से अधिक हो। पहली बार कुछ सेकंड, और OOM की प्रत्येक घटना के लिए प्रतीक्षा समय बढ़ा है।)