在一次项目中,运行七八小时后,软件的日志突然不记录了,界面也不刷新(没有假死),查了半天代码也没发现那里有问题,后来在网上查资料发现可能是运行过程中创建的对象太多了,造成内存泄漏,才发现虽然微软声称 GC 的功能和智能化都很高,但是内存的自动回收还是存在问题,后来采用windows自带的api(win32api)接口,定时手动释放内存,软件内存马上以肉眼可见的速度降下来了,软件所有问题都恢复正常。
源码:
#region 内存回收
[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
/// <summary>
/// 释放内存
/// </summary>
public static void ClearMemory()
{
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
//FrmMian为我窗体的类名
FrmMain.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}
#endregion
虽然问题得到解决,但是以后在开发中要注意,能重复使用的对象只要创建一次就可以了。
在此记录。