本人开发的winform程序,用到了线程池,用到了多线程循环读取数据更新,用到了第三方控件,程序启动时内存占用已经在>30M这个水平了,并且发现只要多线程启动,就会内存不断地增加,虽然使用了GC.Collect()但不管是连续使用1次还是两次并不能实际解决问题,只不过是使得每次增加的变动减少到4k左右而已。于是经过各种搜罗发现了如下方法进行内存回收,经过使用,效果非常好,目前基本稳定在3.3M左右,这样就算增加了,但是定期回收了,又变回这个低水平了。
从>30M到>3M这个差异还是很大的,特此记录下来经验,供有需要的人参考:
using System.Runtime.InteropServices; //可以用DllImport了
#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)
{
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}
#endregion
在你认为合适的地方调用
ClearMemory()即可。