بازگشت   پی سی سیتی > کامپیوتر اینترنت و شبکه Computer internet > زبان های برنامه نویسی Programming

زبان های برنامه نویسی Programming بحث در مورد زبانهای مختلف برنامه نویسی

پاسخ
 
ابزارهای موضوع نحوه نمایش
  #1  
قدیمی 04-11-2013
دانه کولانه آواتار ها
دانه کولانه دانه کولانه آنلاین نیست.
    مدیر کل سایت
        
کوروش نعلینی
 
تاریخ عضویت: Jun 2007
محل سکونت: کرمانشاه
نوشته ها: 12,700
سپاسها: : 1,382

7,486 سپاس در 1,899 نوشته ایشان در یکماه اخیر
دانه کولانه به Yahoo ارسال پیام
پیش فرض برطرف کردن مشکل حافظه در برنامه های تحت دات نت

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

راهکاری جالب جهت برطرف کردن مشکل مدیریت حافظه در برنامه های تحت Net Framework.


محمد باقری

شاید بحثی که در این مقاله قرار است به آن بپردازیم یکی از مهمترین مسائل اصولی و پایه برای برنامه نویسان دات نت می باشد. چرا که مدیریت حافظه یکی از مشکلاتی است که همه برنامه نویسان دات نت با آن برخورد داشته و یا در آینده خواهند داشت!

چرا در دات نت نمی توان حافظه را به طور کامل آزاد کرد؟
نکته اینجاست که سیستم نظارت بر حافظه در دات نت مدیریت شده است (Managed) برای همین به برنامه نویس اجازه داده نمی شود که خود در مورد مدیریت کردن حافظه تصمیم بگیرد.

مشکل سیستم مدیریت حافظه در دات نت چیست؟
سیستم مدیریت کننده حافظه در دات نت ممکن است در مواقعی بتواند حافظه ای که برنامه اشغال کرده است را آزاد سازی کند ولی در اکثر مواقع این کار به درستی انجام نمی شود. در هر حال هرچند شرکت مایکروسافت کلاسی به نام GC را تعبیه کرده است (Garbage Collector) که به صورت اتوماتیک اشیاء ای که نیازی به وجود آنها نیست را از حافظه پاک کند ، ولی متاسفانه این کلاس نیز گاهی درست عمل نمی کند.

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






1public static void FlushMemory() { System.Diagnostics.Process prs = System.Diagnostics.Process.GetCurrentProcess(); try{ prs.MinWorkingSet = (IntPtr)(300000); } catch { } }




تابعی که شما ملاحظه نمودید در اصل جهت Refresh کردن قسمتی از حافظه است که برای برنامه تخصیص داده شده است. شما می توانید این کد را به دو طریق فراخوانی کنید.

1. پس از هر عملیاتی که شما شیئی جدید می سازید و یا آنرا حذف می کنید. (Dispose)

2. به طور مستمر بوسیله تایمری که بر روی Interval خاصی تنظیم شده باشد. (مثلا 2000 میلی ثانیه)

در هر حال پس از فراخوانی این تابع شما خواهید دید که حافظه تخصیص داده شده برای برنامه شما بطور شگفت انگیزی تغییر خواهد کرد و در واقع پویا خواهد شد.

در زیر نمونه ای از عملکرد یک برنامه که در ابتدا در حالت اولیه قرار دارد (تصویر اول حدود 6MB) و سپس اشیاء بسیاری را به صورت تصادفی ساخته (تصویر دوم حدود 370MB) و در نهایت پس از حذف آنها که هیچ تغییر محسوسی در حافظه تخصیص داده شده به برنامه روی نمی دهد (تصویر سوم) و در نهایت فراخوانی تابع شگفت انگیز (تصویر چهارم حدود 2MB) حافظه تخصیص داده شده به برنامه حتی کمتر از آنچه که در حالت اولیه بود (تصویر اول) بر می گردد.





__________________
مرا سر نهان گر شود زير سنگ -- از آن به كه نامم بر آيد به ننگ
به نام نكو گر بميــرم رواست -- مرا نام بايد كه تن مرگ راست



پاسخ با نقل قول
پاسخ


کاربران در حال دیدن موضوع: 1 نفر (0 عضو و 1 مهمان)
 
ابزارهای موضوع
نحوه نمایش

مجوز های ارسال و ویرایش
شما نمیتوانید موضوع جدیدی ارسال کنید
شما امکان ارسال پاسخ را ندارید
شما نمیتوانید فایل پیوست در پست خود ضمیمه کنید
شما نمیتوانید پست های خود را ویرایش کنید

BB code is فعال
شکلک ها فعال است
کد [IMG] فعال است
اچ تی ام ال غیر فعال می باشد



اکنون ساعت 07:44 AM برپایه ساعت جهانی (GMT - گرینویچ) +3.5 می باشد.



Powered by vBulletin® Version 3.8.4 Copyright , Jelsoft Enterprices مدیریت توسط کورش نعلینی
استفاده از مطالب پی سی سیتی بدون ذکر منبع هم پیگرد قانونی ندارد!! (این دیگه به انصاف خودتونه !!)
(اگر مطلبی از شما در سایت ما بدون ذکر نامتان استفاده شده مارا خبر کنید تا آنرا اصلاح کنیم)


سایت دبیرستان وابسته به دانشگاه رازی کرمانشاه: کلیک کنید




  پیدا کردن مطالب قبلی سایت توسط گوگل برای جلوگیری از ارسال تکراری آنها