有没有办法看到C#应用程序泄露的内存?

时间:2014-04-07 12:03:37

标签: c# wpf winforms memory-leaks

我的应用程序包含Windows Media PlayerImage box等不同的组件。所有组件都是 playing back to back one after another 。一个Panel作为父级的用户控制器包含5 GridsGrid是4 Labels的组合。并且同一个用户控制器的表单有2个带有视频和图像的实例。

由于这一点,我的应用程序每秒都会将其提交的内存大小增加2MB。一段时间后,由于内存不足,我的应用程序停止了。所以我想看看内存泄漏的部分或组件。

是否有免费软件软件来监控内存泄漏?

6 个答案:

答案 0 :(得分:0)

&#34;如果您怀疑存在用户模式内存泄漏但不确定导致它的进程,则可以使用性能监视器来测量各个进程的内存使用情况。&#34; < / em>的

请参阅http://msdn.microsoft.com/en-us/library/windows/hardware/ff560134(v=vs.85).aspx

答案 1 :(得分:0)

使用内存分析器,如ANTS Memory Profiler或EQATEC

答案 2 :(得分:0)

我建议您使用CLR Profiler,它是免费且可自由分发的应用程序:

  

CLR Profiler的主要功能是让您了解应用程序如何与托管的垃圾回收堆进行交互。您可以调查的一些更重要的事项包括:

     
      
  • 谁在托管堆上分配了什么。
  •   
  • 哪些对象在托管堆上存活。
  •   
  • 谁在抓住物品。
  •   
  • 垃圾收集器在您的应用程序生命周期内的作用。
  •   

有关详细信息,请参阅此链接:

How To: Use CLR Profiler

答案 3 :(得分:0)

在ANTS或EQATEC旁边,你也有JetBrains dotTrace。 此外,如果您不想使用分析器,您可以查看代码并查找一次性对象。每个一次性物品在使用结束时应予以处理。 在大多数情况下,如果您以正确的方式处理了所有物体,就不会再有内存泄漏。

您可能继续出现内存不足异常的一种情况是,当您进行多线程处理并且创建的任务数量超过可在一定时间内处理的任务时。

答案 4 :(得分:0)

您可以尝试Coverity。他们发现的缺陷包括:

  • 记忆腐败
  • 崩溃
  • 安全漏洞
  • 并发
  • 未初始化的内存
  • 错误处理
  • 资源泄漏

您可以找到更多here

答案 5 :(得分:0)

要监视.NEE中是否存在内存泄漏,您只需使用Windows性能监视器即可。在本文中:Identify And Prevent Memory Leaks In Managed Code

使用PerfMon检查应用程序的以下性能计数器:进程/专用字节,.NET CLR内存/所有堆中的#字节,以及.NET CLR LocksAndThreads /当前逻辑线程数。 Process / Private Bytes计数器报告专门为进程分配的所有内存,不能与系统上的其他进程共享。 .NET CLR Memory /#Bytes in All Heaps计数器报告Gen0,Gen1,Gen2和大对象堆的总大小。 .NET CLR LocksAndThreads /#当前逻辑线程计数器报告AppDomain中的逻辑线程数。如果应用程序的逻辑线程计数意外增加,则线程堆栈正在泄漏。如果Private Bytes增加,但All Heaps中的#Bytes保持稳定,则非托管内存正在泄漏。如果两个计数器都在增加,那么托管堆中的内存就会增加。

跟踪下载内存泄漏的另一个工具是:DebugDiag。它非常有效,也是免费的。