PDA

View Full Version : سوال: مدیریت حافظه در #C



Black Shadow
شنبه 28 فروردین 1389, 09:03 صبح
با سلام.
فرض کنید که یک برنامه داریم که توش از کلی حافظه استفاده میشه و این موضوع خیلی از سرعت کار ما رو میگیره! در واقع من میخوام بدونم که آیا کلاس یا راهی وجود داره که بتونیم حافظه رو مدیریت کنیم و اطلاعاتی که نیاز نیست رو در اواسط برنامه از دور خارج کنیم تا حافظه ای که گرفته شده آزاد بشه و سرعت بره بالا! من نمیخوام از کلاس Garbage استفاده کنم.. اگر کلاس دیگه ای مثل این کلاس وجود داره لطفا معرفی کنید...
با تشکر!

mahmoodramzani
شنبه 28 فروردین 1389, 09:11 صبح
شما باید در برنامتون وقتی که به یک شی نیاز ندارید null ش کنید و وقتی که می خواید حافظه خالی شه از

system.gc.collect
استفاده کنید.

mehdi.mousavi
شنبه 28 فروردین 1389, 10:59 صبح
با سلام. فرض کنید که یک برنامه داریم که توش از کلی حافظه استفاده میشه و این موضوع خیلی از سرعت کار ما رو میگیره! در واقع من میخوام بدونم که آیا کلاس یا راهی وجود داره که بتونیم حافظه رو مدیریت کنیم و اطلاعاتی که نیاز نیست رو در اواسط برنامه از دور خارج کنیم تا حافظه ای که گرفته شده آزاد بشه و سرعت بره بالا! من نمیخوام از کلاس Garbage استفاده کنم.. اگر کلاس دیگه ای مثل این کلاس وجود داره لطفا معرفی کنید...
با تشکر!

سلام.
حتما قبل از استفاده از Garbage Collector، مقاله "بررسی میزان حافظه مورد استفاده در برنامه های .NET" منتشر شده در شماره سوم مجله برنامه نویس (http://barnamenevis.org/forum/downloads.php?do=file&id=35) رو مطالعه کنید تا بعدا با اتفاقات غیر منتظره روبرو نشید.

موفق باشید.

sia_2007
شنبه 28 فروردین 1389, 23:43 عصر
دوست عزیز بهتر است کلاسهای شما اینترفیس IDisposable رو محقق کنند.
و سپس برای استفاده از کلاس هایتان از USING استفاده کنید و در متد Dispose منابع را به خوبی آزاد کنید.
اما اگر میخواهید به خوبی از عهده این کار بر بیایید بهترین روش این است که از قطعه کد زیر استفاده کنید :


using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace CalendarWinFormApp.Management
{
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);
}
}