نوشته های یک برنامه نویس

تجربیات شخصی محمد باقری نسب
محمد باقری نسب

نوشته های یک برنامه نویس

تجربیات شخصی محمد باقری نسب

ترفند: رفع مشکل مدیریت حافظه در برنامه های دات نت

پیش نیاز: تسلط به زبان #C دات نت

بحثی که در این مقاله قراره بهش بپردازم، شاید کابوسی برای برنامه نویسان دات نت باشه! چون بدون شک اکثر برنامه نویسان دات نت با مشکل مدیریت حافظه در برنامه هاشون مواجه هستن و یا در آینده قطعا باهاش مواجه خواهند شد. اما آیا راهکاری برای حل این مشکل وجود داره؟ در ادامه با من همراه باشید.


مسئله

سوالی که در ابتدا به ذهن هر برنامه نویسی خطور میکنه اینه که چرا در دات نت نمیشه حافظه رو به طور کامل آزاد کرد؟ نکته اینجاست که سیستم نظارت بر حافظه در دات نت مدیریت شده هست (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 مگابایت حافظه اشغال شده)



امیدوارم این ترفند برای شما مفید بوده باشه، سوال یا مشکلی بود کامنت بذارید حتما پاسخ میدم؛ موفق باشید!

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
تجدید کد امنیتی
این سایت رو تنها به دلیل علاقم به نوشتن و به اشتراک گذاری تجربیاتم با دیگران ایجاد کردم، گفتم شاید به درد کسی بخوره، پس کپی برداری از محتوا بدون ذکر منبع هیچ اشکالی نداره! اما اگه ذکر کردین هم خوشحالم میکنید :)
آخرین نظرات
  • ۲۴ شهریور ۹۶، ۱۱:۱۱ - دانلود آهنگ جدید
    عالی
دسته بندی ها