减少内存泄漏的最佳方法是什么?

时间:2012-05-17 05:08:36

标签: c# memory-leaks memorystream

在运行期间,我发现我的应用程序使用了非常大的内存..

但似乎我只使用3~4 MemoryStream s其中一个有时满81 Mb ..

其他主要是20 mb,3 mb和1mb容器......

但应用程序仍有525.xx MB内存使用...

我也尝试使用using(...)语句,但没有任何运气..

所以,我在这里要求最有效的方法来减少内存泄漏。

2 个答案:

答案 0 :(得分:1)

在托管的.NET应用程序中,除了您正在分配非托管资源句柄而不是正确处理它们之外,您通常没有原始意义上的内存“泄漏”。但这听起来不像你在做什么。

更有可能的是,您正在继续引用不再需要的对象,这使得内存“活着”的时间比您预期的要长。

例如,如果将5MB数据放入内存流中,然后将该内存流分配给静态字段,那么5MB将永远不会在应用程序的生命周期内消失。当你不再需要它所指向的内容流时,你需要为引用内存流的静态字段赋值null,以便垃圾收集器释放并回收那5MB内存。

同样,在函数退出之前不会释放局部变量。如果分配大量内存并将其分配给局部变量,然后调用另一个运行数小时的函数,则局部变量将始终保持活动状态。如果您不再需要该内存,请将null指定给局部变量。

您如何确定您的应用有内存泄漏?如果您正在查看任务管理器显示的进程虚拟内存分配,那么这不是很准确。应用程序的内存管理器可以从操作系统分配大块内存,并在内部释放它们以供应用程序内的其他用途,而不会将它们释放回操作系统。

使用常识做法。调用dispose或close,并在不再需要其内容时立即为变量赋值。

仅仅因为垃圾收集环境会让你变得懒惰并不意味着你不应该注意代码中的内存分配和释放模式。

答案 1 :(得分:0)

你对内存泄漏的定义似乎很不寻常......下面的代码会产生你正在观察的效果,但它很少称为内存泄漏:

var data = new byte[512*1024*1024];
data = null;

但实际上你可能有合法的泄密。内存分析器可以轻松显示它们,但可以通过代码审查来跟踪大型内存分析器。如果您已经知道您拥有少量内存流 - 请检查您是否通过存储在某个列表中或仅在成员变量中保留它们。还要检查你的大型阵列是否因为类似的原因而无法生存。

相关问题