日期:2014-05-18  浏览次数:20940 次

内存释放,读了10万行记录,现在关闭窗体后内存依旧占用。
C# code
        /// <summary>
        /// 概述:释放当前查询结果。如果该查询结果没有放置于全局变量,应当【using】。
        /// </summary>
        public void Dispose()
        {
            if (!this._isDisposed)
            {
                this.OnDisposing();

                (this._result as IDisposable).TryDispose();
                this._exception = null;
                if (this._command != null)
                {
                    this._command.Connection.TryDispose();
                    this._command.Connection = null;
                    this._command.Dispose();
                }
                this._isDisposed = true;
            }
        }


这是释放资源的源代码。我想,我是不是还缺点什么?(this._result是一个DataTable)
一开始启动的时候,是10M,然后 登录+ 权限 验证进去后飙升到20M,
接着,我打开包含10W条记录的表到一个新窗体的grid上。内存飙升到60M-70M左右。
可是当我关闭后,内存依旧占用着。
等到我再次打开,内存继续上升(第二次大约90M,第三次大约120M)……
加上

C# code
                GC.Collect();
                GC.WaitForPendingFinalizers();

仍然没有效果。

以前很少注意这点,今天忽然关注了一下, 发现自己遗漏了非常可怕的东西……
不敢怠慢,赶紧求解……

------解决方案--------------------
DataTable 占用资源直接关闭窗口,很容易释放的。 是否用到其它非托管资源了?
------解决方案--------------------
public void Dispose()
所处的位置 是否与 其它全局变量 处一同级 影响资源回收


------解决方案--------------------
数据量很大,分页获取数据
检查程序是否需要优化
多使用using,sqldatareader,释放资源

------解决方案--------------------
完成后调用这个实施 
 public void Close()
{
if (mycon.State == ConnectionState.Open)
{
mycon.Close();
mycon.Dispose();
}
}
------解决方案--------------------
先帮你 顶,吃饭去了。
------解决方案--------------------
探讨
解决了。但不知道是不是有效解决办法。

------解决方案--------------------
情况比较复杂哦,楼主分享下解决办法吧,学习学习
------解决方案--------------------
have you solve problem ?
congratulate you .
------解决方案--------------------
不是这里的问题,是你调用的位置在占用内存
------解决方案--------------------
你的DataTable被窗体引用了,你的窗体被外面引用了,不删除引用无法释放内存
------解决方案--------------------
代码不全,不易调试。写得太复杂了,说不出准确原因。

编程思路可以优化:
(1)托管代码下,.NET的基础类,不用特殊处理。人工回收不一定比系统自动回收机制性能更好,可能更差。多余的程序代码只会增加维护成本。
(2)按照面向对象的编程思想,尽量不要用静态类,尽量不要用全局变量。
(3)系统设计,尽量减少层次,不是层次越多越好,而是越少越好。
按照这种思想,改一下代码许多问题可能自动消失了,有问题也是发生在局部,很容易维护。

资源回收用在真正需要用代码回收的地方,如非托管类调用,第三方控件。