记录winform程序随运行时间边长,内存占用越来越大的问题解决方案

在项目运行中遇到软件日志停止和界面无刷新的问题,经排查发现是由于内存泄漏导致。尽管.NET的垃圾回收机制(GC)通常有效,但在某些情况下仍需手动干预。通过调用WindowsAPI的SetProcessWorkingSetSize方法,实现了内存的手动释放,显著降低了内存使用,恢复了软件正常运行。开发者应注意减少不必要的对象创建,提高对象复用以防止类似问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一次项目中,运行七八小时后,软件的日志突然不记录了,界面也不刷新(没有假死),查了半天代码也没发现那里有问题,后来在网上查资料发现可能是运行过程中创建的对象太多了,造成内存泄漏,才发现虽然微软声称 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

虽然问题得到解决,但是以后在开发中要注意,能重复使用的对象只要创建一次就可以了。

在此记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值