如何克服.Net中的内存泄漏问题(Windows应用程序)

时间:2010-09-03 14:52:49

标签: c# .net

我的应用程序运行时出现内存泄漏问题。 应用程序使用CPU内存。

最低百分比为6% 最大百分比为35% 最大峰值内存为90MB

我使用ANTS Memory Profiler分析应用程序中的内存泄漏。 但我不知道如何在运行时减少Application的内存使用量。

请任何人尽快给我解决方案。

谢谢和问候 Ramesh N

4 个答案:

答案 0 :(得分:3)

你怎么知道你有内存泄漏?请记住,如果系统没有内存压力,GC可能无法运行,因此可能看起来正在分配内存并且未释放 - 如果需要,GC将处理它。

答案 1 :(得分:0)

为什么您认为您的应用程序正在泄漏?如果它保持一致的90MB使用率,那么这不是泄漏 - 它只是显示比你想象的更多的内存使用。如果它是真正的内存泄漏,那么随着时间的推移,它会因使用而增加。如果你不能达到100MB,那么它并没有真正泄漏...

.NET应用程序通常显示出比您预期的更高的内存使用率(特别是在任务管理器的某些视图中)。这个实际上对你来说是一个问题,还是你觉得它是一个问题因为它比你想象的要高?

答案 2 :(得分:0)

您是否在使用内存时遇到任何问题?否则它似乎根本不存在问题。

除非有任何实际的内存韭菜(但我认为没有,因为你有配置文件的配置文件),使用几兆字节或内存,甚至不断增长到某一点的应用程序都没有问题。

一个常见的误解是计算机应该拥有尽可能多的可用内存,但是没有性能优势。拥有未使用的内存不会使应用程序以任何方式运行得更快。

.NET应用程序在运行时分配更多内存是正常的。只要有空闲内存,这比运行throrough垃圾收集以尝试释放内存更有效。应用程序将在需要时清理内存。

系统可以向应用程序发送信号,以释放尽可能多的内存。如果您将应用程序最小化,则会向其发送此信号,因此您可以使用该信号来查找应用程序使用的内存大小超过绝对最小值。

答案 3 :(得分:0)

首先,输入一些 TEMPORARY 代码,定期调用GC.GetTotalMemory(true)并记录它。

运行应用程序一段时间。

然后拿出临时代码。由于这种方法确实会损害内存使用,但它会为您提供一些有用的细节。请记住,这纯粹是一个调查步骤,而不是在99%的生产代码中使用。

现在,看看它返回的数字是否正在稳步攀升。如果它们不是(包括攀爬然后再次下降),那你没问题。解决方案结束。

如果这样做,那么您需要查看非托管资源的直接或间接使用,这些资源可以是非托管内存,也可以使用它。这些将分裂成太多案例。

首先是您自己使用非托管资源的地方。确保将它们包裹在一些基于安全手柄的包装纸中,并且每次使用时都要将它们包裹起来并配有定型器。不要在同一个类中混合使用托管和非托管资源(然后避免使用Dispose(bool)模式,因为它实际上是混合这些模式的反模式的一部分。)

第二个是你使用的东西反过来使用非托管资源。如果它实现了IDisposable,那么类可能。确保它们始终处于丢弃状态。

确保您不会不必要地实习。实习字符串是一种有用的节省内存的技术,但前提是您知道在项目的整个生命周期中将定期使用所讨论的字符串值(或者至少,您将添加一些不会再次使用的字符串值。那一辈子)。如果你没有经常使用的实习字符串,那么你已经找到了将内存推送到托管代码的最佳位置的最佳方法之一(GC现在可以在实习池上进行,但通常不会。)< / p>

还有一些技术可以减少内存使用而不是避免泄漏,但由于你只使用了很少的内存(90MB),所以这里不值得考虑。

顺便说一下,你有什么大小的页面文件? 90MB是35%意味着总内存为256MB。除非你有64MB的物理RAM,否则它有点低。目前的建议将页面文件放在物理RAM的大约100%或更少的位置,但这是基于目前更大RAM大小的趋势。如果你有128MB的东西,我至少会翻倍该页面文件,总内存大约为390MB。