2010-09-03 21 views
1

我的应用程序运行时遇到内存泄漏问题。 应用程序使用这样的CPU内存。如何解决.Net中的内存泄漏问题(Windows应用程序)

最小百分比为6% 最大百分比是35% 最大峰值存储器是90MB

我已经使用ANTS内存分析器用于在应用程序判断内存泄漏。 但我不知道如何在运行时减少应用程序的内存使用量。

请任何人能尽快给我解决。

感谢和问候 拉梅什ň

+1

代码示例请,需要更多的信息来帮助你。只是对于初学者来说,也许看看你可能拥有的任何递归和值/不可变类型,看看你是否正在做任何可能以指数形式产生它们的东西。 – 2010-09-03 14:56:25

+1

90MB对于内存泄漏没有多大意义。如果在几个小时后是900 MB,那么可能有问题。 – 2010-09-03 14:56:29

+0

90MB?这不坏... – SLaks 2010-09-03 14:56:44

回答

3

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

0

为什么你认为你的应用程序正在泄漏?如果它一直保持90MB的使用率,那么这不是泄漏 - 它只是展示了比你想象的更多的内存使用。如果它是一个真正的内存泄漏,那么随着时间的推移,它会通过使用而变得更高。如果你不能得到它的100MB那不是真的泄漏...

.NET应用程序通常表现出较高的内存使用情况(特别是在任务管理器中的某些观点),超出你的想象。这是实际上是对你来说是一个问题,还是你认为它是一个问题,因为它比你想象的要高?

0

你体验到内存使用什么问题?否则,它似乎不存在任何问题。

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

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

这是正常的,因为它运行的.NET应用程序分配更多的内存。只要有空闲的内存,这比运行垃圾收集来释放内存的效率要高得多。应用程序将在需要时清理内存。

该系统可将信号发送到应用程序,使其释放出尽可能多的内存可能。如果你最小化一个应用程序,这个信号被发送给它,所以你可以用它来找出你的应用程序使用的内存大概多于绝对最小值。

0

首先,放入一些TEMPORARY定期调用GC.GetTotalMemory(true)的代码并记录下来。

运行该应用程序一段时间。

然后取出该临时代码。由于此方法确实会伤害内存使用,但它会为您提供一些有用的细节。请记住,这纯粹是一个调查步骤,不适用于99%的产品代码。

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

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

第一个是你自己正在使用非托管资源的地方。确保你将它们包装在一些基于安全句柄的包装中,并且每次使用时都会处理它们,并附带一个终结器。不要混合直接使用同一类中的托管和非托管资源(然后避免使用Dispose(bool)模式,因为它实际上是混合这些模式的反模式的一部分)。

第二个是你在哪里使用的东西,反过来使用非托管资源。如果它实现了IDisposable,那么类可能是。确保这些东西都经常丢弃。

确保你没有不必要地实习字符串。实习字符串是一种有用的节省内存的技巧,但只有在知道字符串值在项目的整个生命周期中都会被正常使用的时候(或者至少你会添加一些不会再被使用的字符串那一生)。如果你实习的字符串不经常使用,你已经选择了使用托管代码将内存推向紧张的最佳方式之一(GC现在可以在实习生池中发生,但通常不会)。

也有减少内存使用而不是避免泄漏的技术,但由于您只使用了非常少量的内存(90MB),因此这里不值得考虑。

顺便提一句,你有什么尺寸的页面文件? 90MB为35%意味着256MB的总内存。除非你有64MB的物理内存,这有点低。目前的建议是将页面文件放在物理内存的100%或更少,但这是基于现在趋向于更大的内存大小。如果你拥有128MB的内存,那么我至少会将这个页面文件加倍,从而给出大约390MB的总内存。