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

5

我有一个包含不同组件的应用程序,比如Windows Media PlayerImage box等。所有组件都是依次播放一个接一个地播放。用户控制器具有Panel作为父容器,其中包含5个Grids和一个Grid是4个Labels的组合。该用户控制器在表单中有2个实例,一个为视频,另一个为图像。

由于这个原因,每秒钟我的应用程序的承诺内存大小增加2MB。经过一段时间后,我的应用程序由于内存不足而停止工作。因此,我想看看哪个部分或组件泄漏了内存。

有没有任何免费软件可以监视内存泄漏?

6个回答

1
要监测.NET中是否存在内存泄漏,您可以使用Windows性能监视器。从这篇文章中:识别和预防托管代码中的内存泄漏:使用PerfMon检查以下应用程序的性能计数器:Process/Private Bytes、.NET CLR Memory/# Bytes in All Heaps和.NET CLR LocksAndThreads/# of current logical Threads。Process/Private Bytes计数器报告了专门为进程分配且无法与系统上其他进程共享的所有内存。.NET CLR Memory/# Bytes in All Heaps计数器报告了Gen0、Gen1、Gen2和大对象堆的总大小。.NET CLR LocksAndThreads/# of current logical Threads计数器报告了AppDomain中逻辑线程的数量。如果应用程序的逻辑线程计数意外增加,则线程堆栈泄漏。如果Private Bytes在增加,但# Bytes in All Heaps保持稳定,则未经管理的内存泄漏。如果两个计数器都在增加,则托管堆中的内存正在积累。
另一个跟踪下载内存泄漏的工具是:DebugDiag。它非常有效,而且还是免费的。

0

谢谢回复,我花了一些时间使用性能监视器,从中我能够获得我的应用程序的总体内存图。 - user1855484

0
使用一个内存分析工具,比如ANTS Memory Profiler或EQATEC。

0

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

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

  • 谁在托管堆上分配了什么。
  • 哪些对象在托管堆上存活。
  • 谁持有对象。
  • 垃圾回收器在应用程序生命周期内执行了什么操作。

有关更多信息,请参见此链接:

如何使用CLR Profiler


谢谢@Anatoliy,看起来很不错,但我让我的应用程序过夜了。早上,CLR分析器弹出一个窗口,说要关闭程序,而CLR命令提示符则显示内存不足。 - user1855484

0

除了ANTS或EQATEC之外,您还可以使用JetBrains dotTrace。

如果您不想使用分析器,可以查看您的代码并查找可处理对象。每个可处理对象在使用结束时都应该被处理掉。

在大多数情况下,如果您以正确的方式处理了所有对象,就不会再有内存泄漏问题。

一个可能导致内存不足异常的情况是当您进行多线程操作并创建了超过一定时间内可以处理的任务数量。


0

你可以尝试使用Coverity。它们可以发现以下缺陷:

  • 内存损坏
  • 崩溃
  • 安全漏洞
  • 并发问题
  • 未初始化的内存
  • 错误处理
  • 资源泄漏

你可以在这里找到更多信息。


这是免费软件吗? - Anatoliy Nikolaev
谢谢@Wasif,我需要将我的应用程序上传到网站上的Coverity。我是对的吗@Wasif? - user1855484

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接