在一次项目中,运行七八小时后,软件的日志突然不记录了,界面也不刷新(没有假死),查了半天代码也没发现那里有问题,后来在网上查资料发现可能是运行过程中创建的对象太多了,造成内存泄漏,才发现虽然微软声称 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
虽然问题得到解决,但是以后在开发中要注意,能重复使用的对象只要创建一次就可以了。
在此记录。
在项目运行中遇到软件日志停止和界面无刷新的问题,经排查发现是由于内存泄漏导致。尽管.NET的垃圾回收机制(GC)通常有效,但在某些情况下仍需手动干预。通过调用WindowsAPI的SetProcessWorkingSetSize方法,实现了内存的手动释放,显著降低了内存使用,恢复了软件正常运行。开发者应注意减少不必要的对象创建,提高对象复用以防止类似问题。
6629

被折叠的 条评论
为什么被折叠?



