আমি এখনও এই সম্পর্কে বেশ অনিশ্চিত। আমি একটি অ্যাপ্লিকেশন সার্ভারে 7 বছর ধরে কাজ করছি। আমাদের বড় ইনস্টলেশন 24 গিগাবাইট রাম ব্যবহার করে। এটির বহুবিধ বহুবিশেষ এবং জিসি.কলেক্ট () এর জন্য সমস্ত কল সত্যই ভয়ানক পারফরম্যান্স সমস্যার সমাধান করেছে।
অনেক তৃতীয় পক্ষের উপাদানগুলি জিসি.ক্লোকলেট () ব্যবহার করেছিল যখন তারা ভেবেছিল এখনই এটি করা চালাক। সুতরাং এক্সেল-রিপোর্টগুলির একটি সহজ গোছা অ্যাপ্লিকেশন সার্ভারকে এক মিনিটে কয়েকবার সমস্ত থ্রেডের জন্য অবরুদ্ধ করে।
জিসি.কালেক্ট () কলগুলি সরাতে আমাদের তৃতীয় পক্ষের সমস্ত উপাদানগুলি রিফ্যাক্টর করতে হয়েছিল এবং এটি করার পরে সকলেই ভাল কাজ করেছে।
তবে আমি উইন 32 এ সার্ভারগুলিও চালিয়ে যাচ্ছি এবং এখানে আমি আউটআফমিউরিএক্সেপশন পাওয়ার পরে জিসি.ক্ল্যাক্ট () ব্যবহার করে ভারী ব্যবহার শুরু করি।
তবে আমি এটি সম্পর্কে বেশ অনিশ্চিত, কারণ আমি প্রায়শই লক্ষ্য করেছি যে, আমি যখন 32 বিট-তে একটি ওওএম পাই এবং আমি আবারও একই অপারেশন চালানোর চেষ্টা করি, জিসি.ক্ল্যাক্ট () না কল করে, এটি ঠিক কাজ করেছিল।
একটা জিনিস আমি অবাক করেছিলাম ওম ব্যতিক্রম নিজেই ... আমি যদি নেট নেট ফ্রেমওয়ার্কটি লিখে থাকতাম এবং আমি কোনও মেমরি ব্লক বরাদ্দ করতে না পারি, তবে আমি জিসি.ক্ল্যাক্ট (), ডিফ্র্যাগ মেমরি (??) ব্যবহার করতাম, আবার চেষ্টা করুন , এবং যদি আমি এখনও একটি নিখরচায় মেমোরি ব্লকটি খুঁজে না পাই তবে আমি ওওএম-ব্যতিক্রম নষ্ট করব।
বা কমপক্ষে এই আচরণটিকে কনফিগারযোগ্য বিকল্প হিসাবে তৈরি করুন, জিসি.কলেক্টের সাথে পারফরম্যান্স ইস্যুটির ত্রুটিগুলি।
সমস্যাটি "সমাধান" করতে এখন আমার অ্যাপ্লিকেশনটিতে এর মতো প্রচুর কোড রয়েছে:
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);
}
(নোট করুন যে থ্রেড। স্লিপ () আচরণটি একটি সত্যই অ্যাপ্লিকেশনীয় আচরণ, কারণ আমরা একটি ওআরএম ক্যাচিং পরিষেবা চালাচ্ছি এবং র্যাম কিছু পূর্বনির্ধারিত মানগুলি অতিক্রম করে, তবে পরিষেবাটি সমস্ত ক্যাশেড অবজেক্টগুলি প্রকাশ করতে কিছুটা সময় নেয় so তাই এটি অপেক্ষা করে প্রথমবার কয়েক সেকেন্ড, এবং ওওমের প্রতিটি ঘটনার অপেক্ষার সময় বৃদ্ধি পেয়েছে))