PDA

View Full Version : أزاد سازي حافظه



saber4166
دوشنبه 24 خرداد 1389, 11:24 صبح
سلام بر دوستان
من ميخواهم بعد از استفاده از هر قسمت مثل كلاسها يا يك فرم جديد بعد از بايان كار اونو از حافظه خارج كنم و حافظه ي مصرفي توسط اون رو ازاد كنم
البته نمي خوام كل حافظه مربوط به كل برنامه رو ازاد كنه فقط ميخوام حافظه مربوط به همون Object يا دستور رو ازاد كنم

خسرو خان
دوشنبه 24 خرداد 1389, 11:31 صبح
;()ClassName.Dispose

saber4166
دوشنبه 24 خرداد 1389, 11:37 صبح
;()ClassName.Dispose



دوست عزيز اين كار رو كرده بودم ولي براي فرم ديدم هر بار كه فرم رو ميبندمو باز ميكنم حافظه ي بيشتري ميكيره بدون اينكه كم كنه
البته به اين شكل نوشتم


frmShenase f = new frmShenase();
f.ShowDialog();
f.Dispose();

Open-Source
دوشنبه 24 خرداد 1389, 11:51 صبح
بعد از اجرای متد Dispose حافظه شما آزاد میشه.
ولی ممکنه که شما توی Task Manager تغییری نبینید.

این حافظه آزاد شده زمانی که سیستم عامل بهش نیاز داشته باشه دوباره مورد استفاده قرار میگیره؛ یعنی زمانی که توی حافظه اصلی چیزی گیرش نیاد، میره سراغ اون حافظه ای آزاد شده.

sia_2007
دوشنبه 24 خرداد 1389, 14:52 عصر
public static class MemoryManagment
{
public static void FreeMemryWorker()
{
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
try
{
FlushMemory();
FreeMemory();
}
catch (Exception)
{

}
}
GC.Collect();
}

private static void FlushMemory()
{
SetProcessWorkingSetSize(Process.GetCurrentProcess ().Handle, 0x1e8480, 0x1e8480);
}

private static void FreeMemory()
{
SetProcessWorkingSetSize(Process.GetCurrentProcess ().Handle, -1, -1);
}

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool SetProcessWorkingSetSize(IntPtr procHandle, int min, int max);
}



توجه داشته باش که این DLL فراخوانی شده؛ Managed نیست.
در واقع همون DLL معروف kernel32.dll است.

r00tkit
دوشنبه 24 خرداد 1389, 14:59 عصر
GC خیلی پیچیده تر از اینهاست
پیشنها می کنم فصل 21 کتاب clr via c# رو بخونید (البته خودم تنبلی کردم هنوز خوب نخوندمش)

sia_2007
دوشنبه 24 خرداد 1389, 15:37 عصر
ببین استفاده از Interface IDisposable هم خوبه + استفاده از بلاک USING
در ضمن منابع مدیریت نشده رو خودتون باید مدیریت کنید؛ مثل بستن Connection و File Stream ها و ... .
حرف geek هم کاملا درسته؛ اصل قضیه پیچیده تر از این حرفهاست.

r00tkit
دوشنبه 24 خرداد 1389, 16:12 عصر
ببین استفاده از Interface IDisposable هم خوبه + استفاده از بلاک USING
در ضمن منابع مدیریت نشده رو خودتون باید مدیریت کنید؛ مثل بستن Connection و File Stream ها و ... .

البته کار using اینه که متود dispose رو درست invoke کنه و کار dispose اینه که منابع


Use this method to close or release unmanaged resources such as files, streams, and handles held by an instance of the class that implements this interface. By convention, this method is used for all tasks associated with freeing resources held by an object, or preparing an object for reuse.
یعنی در کل شما باید از dispose استفاده کنید (که همون ازاد سازی منابع که دوستمون گفت ) ،البته وقتی با Com کار می کنید می تونید از
System.Runtime.InteropServices.Marshal.ReleaseComO bject استفاده کنید

شاید در اینده ای نزدیک فصل 21 رو ترجمه و همین جا قرار دارم