是什么导致我的C#.NET内存泄漏,在一个闲置的应用程序?

时间:2010-02-13 01:09:19

标签: c# .net memory profiler memory-leaks

我正在尝试解决应用程序中的一些内存泄漏问题,我真的希望有人能为我提供一些有用的见解。我整天都在修补这一点,我担心自己完全陷入困境。

我正在排除故障的应用程序最初工作正常,但如果在闲置几个小时后使用它会变得迟缓甚至崩溃。我认为这是由于某种内存泄漏随着时间的推移而变得越来越糟。据我所知,没有内部进程,如计时器或无限循环等,可以解释内存泄漏,但症状是可重现的,所以肯定会发生一些事情。

为了尝试解决这个问题,我下载并安装了.NET Memory Profiler的试用版。不幸的是,我不确定如何解释我得到的结果。据我所知,在我看来最有问题的类是系统类,如System.Version和System.Object []。我想这是基于这样的假设,即“要查找的数据”是分析器报告的无法访问的实例数和字节数。

以下是一些示例数据,类似于我所看到的:

  1. 命名空间:系统
    • 班级名称:版本
    • 实时实例......
    • 总计:2
    • Delta:0
    • Live Bytes ...
    • 总计:48
    • 新:48
    • 最大:24
    • Delta:0
    • 不可达...
    • 实例:15,556
    • 字节:373,344
  2. 命名空间:系统
    • 班级名称:对象[]
    • 实时实例......
    • 总计:1,198
    • Delta:0
    • Live Bytes ...
    • 总计:117,916
    • 新:117,916
    • 最大:7,016
    • Delta:0
    • 不可达...
    • 实例:3,054
    • 字节:204,592
  3. 如果我正确读到这一点,我面临的两个最大的问题是我有超过15,000个汇编版本的实例和超过3,000个“无法访问”的对象,尽管我承认我并不完全确定“是什么意思”不可达“。

    所以,我的具体问题是:

    • 有人能告诉我我是否正确阅读.Net Memory Profiler数据吗?
    • 如果我正确地读取数据,是什么原因导致我的应用程序生成更多的程序集版本实例和更多对象实例,而没有最终用户与之交互?

1 个答案:

答案 0 :(得分:5)

没有任何真实的证据证明您发布的内容存在任何泄漏。垃圾收集器已经运行了一段时间,这在空闲程序中是正常的。那些未收集的物品的0.5 MB是花生。

程序闲置一段时间后会发生的事情是它的虚拟内存页面将被换出到页面文件中。当它重新获得焦点时,需要将这些页面换回。当机器老化时,可能需要一段时间。您真正的问题很可能是磁盘碎片,特别是在页面文件上。

你应该能够从硬盘驱动器访问指示灯,它应该疯狂地闪烁。您还可以从TaskMgr.exe,Process选项卡中了解。查看+选择列,勾选Page Fault Delta。在恢复程序窗口后,该数字应在一秒或更短时间内变为零。

对磁盘进行碎片整理。特别是分页文件,这很难做到。在superuser.com上提出有关该问题的问题