我有一个 MDI它有一个子形式。子窗体有一个 DataGridView在里面。我在数据 GridView 中加载了大量数据。当我关闭子表单时,调用处理方法,我在其中处理 datagridview
this.dataGrid.Dispose();
this.dataGrid = null;
当我关闭表单时,内存不会消失。我用 .NET memory profiler跟踪内存使用情况。我看到当我最初加载数据网格时(如预期的那样)内存使用率很高,然后在加载完成时变得恒定。
当我关闭表单时它仍然保持不变。但是,当我使用内存分析器拍摄内存快照时,它会下降到加载文件之前的状态。拍摄内存快照会导致其强制运行垃圾收集器。
这是怎么回事?是否存在内存泄漏?还是我需要强制运行垃圾收集器?
更多信息:
当我关闭表单时,我不再需要这些信息。这就是为什么我没有保留对数据的引用。
更新
一次加载所有数据对我来说是一个要求。当有大量数据时内存使用率真的很高所以我想知道我是否做错了什么并且垃圾收集器没有运行但另一方面当我查看分析器时它确实显示当它需要快照内存使用减少。所以我无法理解发生了什么。
请您参考如下方法:
将变量设置为 null
不会神奇地强制调用垃圾收集器。 GC 是一个昂贵的过程,除非绝对必要,否则应该避免,因此收集器仅在计划的时间或需要时运行。
如果您确实需要确保释放内存,请在清空 DataGrid 后手动调用垃圾收集器:
this.dataGrid.Dispose();
this.dataGrid = null;
GC.Collect();
但是,正如 Matthew Scharley 指出的那样,CLR 保留该内存真的重要吗?如果强制释放它,那么下次填充 DataGrid 时,CLR 需要重新分配相同数量的内存 - 这很慢。
除非您的 DataGrid 消耗的内存接近或超过您计算机上的物理内存,否则请不要管 CLR - 在内存管理方面,它几乎肯定是最了解的。