بحثی که در این مقاله قراره بهش بپردازم، شاید کابوسی برای برنامه نویسان دات نت باشه! چون بدون شک اکثر برنامه نویسان دات نت با مشکل مدیریت حافظه در برنامه هاشون مواجه هستن و یا در آینده قطعا باهاش مواجه خواهند شد. اما آیا راهکاری برای حل این مشکل وجود داره؟ در ادامه با من همراه باشید.
سوالی که در ابتدا به ذهن هر برنامه نویسی خطور میکنه اینه که چرا در دات نت نمیشه حافظه رو به طور کامل آزاد کرد؟ نکته اینجاست که سیستم نظارت بر حافظه در دات نت مدیریت شده هست (Managed) برای همین به برنامه نویس اجازه داده نمیشه که خودش در مورد وضعیت حافظه اشغال شده توسط برنامه، تصمیم بگیره!
تا اینجا که همه چیز به نظر خوبه؛ یه سیستمی هست که زحمت مدیریت فضای اشغال شده در حافظه رو خودش میکشه و ما مجبور نیستیم به صورت دستی این کارو انجام بدیم، دمشم گرم!
ولی خبر بد اینکه متاسفانه سیستم مدیریت حافظه دات نت در اکثر مواقع این کارو به درستی انجام نمیده و با وجود کلاسی به نام GC که به برنامه نویس این اجازه رو میده تا اشیاء غیر قابل استفاده رو از توی حافظه پاک کنه، متاسفانه طبق تجربه، این کلاس هم تاثیر خاصی روی وضعیت حافظه نداره و ظاهرا درست عمل نمیکنه.
نهایتا بنده خودم با یکی از دوستان برنامه نویس دست به کار شدیم تا شاید راهی برای این مشکل توی دات نت پیدا کنیم و خوشبختانه بعد از کلی تلاش، ترفند جالبی جهت آزاد سازی حافظه در برنامه های دات نتی پیدا کردیم.
public static void FlushMemory() { var prs = System.Diagnostics.Process.GetCurrentProcess(); try { prs.MinWorkingSet = (IntPtr)(300000); } catch { } }
تابع ساده ای که در کد بالا ملاحظه میکنید در واقع جهت Flush کردن بخشی از حافظه هست که به برنامه ما اختصاص داده شده. شما میتونید این تابع رو به یکی از این 2 روش فراخوانی کنید:
1. بعد از هر عملیاتی که شیئی جدید میسازید و یا حذف میکنید (Dispose)
2. به طور مستمر توسط تایمری که بر روی Interval خاصی تنظیم شده باشه (مثلا 2 ثانیه)
به هر حال بعد از فراخوانی این تابع، متوجه خواهید شد که حافظه تخصیص داده شده به برنامتون بطور شگفت انگیزی آزاد میشه!
با هم نمونه ای از عملکرد این ترفند رو در یک برنامه واقعی میبینیم:
1. اجرای برنامه (حدود 6 مگابایت حافظه اشغال شده)
2. اشیاء زیادی به صورت تصادفی ایجاد شد (حدود 370 مگابایت حافظه اشغال شده)
3. مدیریت خودکار حافظه توسط دات نت (تغییر محسوسی در وضعیت حافظه دیده نمیشه)
4. در نهایت فراخوانی تابع شگفت انگیز (حدود 2 مگابایت حافظه اشغال شده)
امیدوارم این ترفند برای شما مفید بوده باشه، سوال یا مشکلی بود کامنت بذارید حتما پاسخ میدم؛ موفق باشید!
ارسال نظر