减少内存泄漏的最佳方法是什么
本文关键字:最佳 方法 是什么 泄漏 内存 | 更新日期: 2023-09-27 18:34:30
在运行时,我发现我的应用程序占用了非常大的内存。
但似乎我只用了3~4 MemoryStream
其中一个有时充满了81 Mb。
其他主要是 20 mb、3 mb 和 1mb 容器......
但是应用程序仍然有 525.xx MB 的内存使用量......
我也尝试使用using(...)
语句,但没有任何运气。
因此,我在这里要求减少内存泄漏的最有效方法。
在托管 .NET 应用中,通常不会出现原始意义上的内存"泄漏",除非分配非托管资源句柄并且未正确释放它们。但这听起来不像你正在做的事情。
更有可能的是,你保留了对不再需要的对象的引用,这使得内存"存活"的时间比你预期的要长。
例如,如果将 5MB 的数据放入内存流中,然后将该内存流分配给静态字段,则 5MB 在应用程序的生命周期内永远不会消失。 当您不再需要内存流指向的内容时,您需要为引用内存流的静态字段分配 null,以便垃圾回收器将释放并回收该 5MB 内存。
同样,在函数退出之前不会释放局部变量。 如果分配大量内存并将其分配给局部变量,然后调用另一个运行数小时的函数,则局部变量将始终保持活动状态。 如果不再需要该内存,请将 null 分配给局部变量。
如何确定应用是否存在内存泄漏? 如果您正在查看任务管理器显示的进程虚拟内存分配,则不是很准确。应用程序的内存管理器可以从操作系统中分配大量内存,并在内部释放它们以供应用程序内的其他用途,而不会将它们释放回操作系统。
使用常识性做法。根据需要调用 dispose 或 close,并在不再需要变量内容时立即为其赋值。
仅仅因为垃圾回收环境会让你懒惰并不意味着你不应该关注代码中的内存分配和释放模式。
您对内存泄漏的定义似乎很不寻常...以下代码将产生您正在观察的效果,但它很少称为内存泄漏:
var data = new byte[512*1024*1024];
data = null;
但你实际上可能有合法的泄漏。内存分析器很容易显示它们,但可以通过代码审查来追踪巨大的。如果您已经知道您有少量内存流 - 请检查您是否没有通过存储在某个列表中或简单地存储在成员变量中来保持活动状态。还要检查您的大型阵列是否由于类似原因而未保持活动状态。