PDA

View Full Version : کاهش حافظه مصرفی برنامه در زمان اجرا



elahe1364
یک شنبه 18 فروردین 1392, 15:37 عصر
سلام دوستان

توی یکی از وبلاگ های فارسی یکی از دوستان کدی رو گذاشته بود برای کاهش حافظه مصرفی برنامه در زمان اجرا که درست هم کار میکنه .

public static void FlushMemory()
{
System.Diagnostics.Process prs = System.Diagnostics.Process.GetCurrentProcess();
try
{

prs.MinWorkingSet = (IntPtr)(300000);

}
catch { }
}

با توجه به اینکه من توی برنامم از متد dispose استفاده نمیکنم و بحث آزادسازی منابع رو ندارم و همچنین یک پروژه dll رو در برنامم صدا میزنم که حاوی تعداد زیادی متغیر static هست.
به نظر شما این درسته که توی برنامم چک کنم و اگه حافظه مصرفی بالا رفت این متد رو صدا بزنم یا نیازی نیست؟؟؟

Amir Oveisi
یک شنبه 18 فروردین 1392, 17:18 عصر
اولا که این کد Minimum رو مقدار میده، که برای هدفی که گفته شده باید Maximum رو مقدار میداده!
در ضمن انجام این کار هیچ تضمینی ایجاد نمیکنه که مقدار مصرف page های حافظه در همون محدوده بمونه:
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.minworkingset.aspx

tooraj_azizi_1035
یک شنبه 18 فروردین 1392, 18:38 عصر
شما مسئول مدیریت حافظه در برنامه نیستید بلکه GarbageCollector چنین مسئولیتی را دارد.
منابع Unmanaged را شما باید با Dispose آزاد کنید.
پاکسازی منابع مدیریت نشده را بخوانید: http://msdn.microsoft.com/en-us/library/498928w2.aspx
این لینک هم خوبه:https://www.simple-talk.com/dotnet/performance/the-top-5-.net-memory-management-misconceptions/

veniz2008
یک شنبه 18 فروردین 1392, 19:39 عصر
سلام.
یه بحثی که چند وقت پیش در تاپیک زیر بصورت اتفاقی مطرح شد و خود من اولین بار بود که با این مورد برخورد میکردم همین پس دادن حافظه مصرفی بعد از انجام کار بود. در اون تاپیک ما یک دیتاتیبل داشتیم که با تعداد زیادی رکورد مقدار دهی میشد. هدف ما این بود که بعد از نمایش اطلاعات در گرید، دیتاتیبل رو پاک کنیم(در واقع حافظه ای که به خودش تخصیص داده بود رو پس بگیریم). سعی کردیم با ()dt.Dispose این کار رو انجام بدیم ولی در عمل چنین اتفاقی صورت نمیگرفت و حافظه مصرفی به سیستم برگشت داده نمیشد. نهایتا بعد از جستجوهای زیاد به این نتیجه رسیدم که dispose به تنهایی چنین کاری رو انجام نمیده! و حتما باید از کلاس GarbageCollector ) GC ) و از متد Collect اون برای باز پس گیری حافظه استفاده کنیم تا حافظه ای که دیتاتیبل گرفته بود رو به زور ازش پس بگیریم. البته یک سوال همچنان برای من باقی موند و اونم این بود که حتی GC هم قادر نبود که %100 حافظه رو از دیتایتبل پس بگیره.(حدودا 90 درصد حافظه رو پس گرفت که قابل قبول تر از هیچی بود). توصیه میکنم دوستان حتما یه نگاه بهش بندازن چون یکی از مفیدترین تاپیک هایی بوده که تا الان دیدم :
http://barnamenevis.org/showthread.php?370492-%D8%AE%D8%A7%D9%84%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-Data-grid-view-%D8%9F&highlight=%D8%AE%D8%A7%D9%84%DB%8C+%DA%A9%D8%B1%D8 %AF%D9%86+Data+grid+view

Amir Oveisi
یک شنبه 18 فروردین 1392, 21:04 عصر
GC به این صورت نیست که در اون لحظه همه حافظه اختصاص یافته به یک object رو release کنه، بلکه اون object رو کاندید میکنه برای release شدن حافظه تخصیصیش و بر اساس الگوریتمی که برای GC وجود داره تصمیم گیری میشه که چه زمانی کدوم یک از کاندید های موجود چه مقدار از حافظش آزاد بشه.

veniz2008
یک شنبه 18 فروردین 1392, 21:33 عصر
GC به این صورت نیست که در اون لحظه همه حافظه اختصاص یافته به یک object رو release کنه، بلکه اون object رو کاندید میکنه برای release شدن حافظه تخصیصیش و بر اساس الگوریتمی که برای GC وجود داره تصمیم گیری میشه که چه زمانی کدوم یک از کاندید های موجود چه مقدار از حافظش آزاد بشه.
خوب سوال اینه : وقتی %90 درصد حافظه برگشت داده میشه یعنی اینکه اون کاندید مورد انتخاب واقع شده که تونسته شده 90 درصد رو ازش پس بگیریم. تکلیف اون 10 درصد باقیمانده چی میشه؟. چرا %90 رو پس میده ولی % 10 رو پس نمیده؟.
وقتی من کارم با یک شی تموم میشه و دیگه بهش نیازی ندارم چرا باید بخشی از حافظه سیستم من رو تلف کنه؟

elahe1364
دوشنبه 19 فروردین 1392, 07:59 صبح
خوب پس این وسط تکلیف متغیرهای static من چی میشه؟
چون همینطور که گفتم من در برنامم یک dll رو صدا میزنم که قبلا توسط شخص دیگه ای نوشته شده و کلی متغیر و لیست استاتیک داره.
اینا مشکلی ایجاد نمیکنند؟