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

标签 c# .net memory profiler memory-leaks

我正在尝试解决应用程序中的一些内存泄漏问题,我真的希望这里有人可以提供一些有用的见解。我整天都在修改这个,恐怕我完全卡住了。

我正在排除故障的应用程序最初运行良好,但如果在闲置几个小时后使用它,它会变得迟缓甚至可能崩溃。我认为这是由于某种内存泄漏导致的,这种情况随着时间的推移变得越来越严重。据我所知,没有内部进程(例如计时器或无限循环等)可以解释内存泄漏,但症状是可重现的,所以肯定是有什么事情发生了。

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

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

  1. 命名空间:系统
    • 类名:版本
    • 实时实例...
    • 总计:2
    • 增量:0
    • 实时字节...
    • 总计:48
    • 新:48
    • 最多:24
    • 增量:0
    • 无法访问...
    • 实例:15,556
    • 字节数:373,344
  2. 命名空间:系统
    • 类名:对象[]
    • 实时实例...
    • 总计:1,198
    • 增量:0
    • 实时字节...
    • 总计:117,916
    • 新:117,916
    • 最多:7,016
    • 增量:0
    • 无法访问...
    • 实例:3,054
    • 字节:204,592

如果我没看错的话,我面临的两个最大问题是我有超过 15,000 个程序集版本实例和超过 3,000 个“无法访问”的对象,尽管诚然我不太确定“无法访问”是什么意思无法访问。”

所以,我的具体问题是:

  • 谁能告诉我是否正确读取了 .Net Memory Profiler 数据?
  • 如果我正确读取数据,什么会导致我的应用程序在没有最终用户与之交互的情况下生成更多程序集版本实例和更多对象实例?

最佳答案

没有真正的证据表明您发布的内容有任何泄露。垃圾收集器已经有一段时间没有运行了,这在空闲程序上是正常的。那些未收集的对象占用的 0.5 MB 是花生。

当一个程序空闲一段时间后会发生什么,它的虚拟内存页面将被换出到页面文件中。当它重新获得焦点时,这些页面需要换回。如果机器是旧的,这可能需要一段时间。您真正的问题很可能是磁盘碎片,尤其是在页面文件上。

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

对磁盘进行碎片整理。尤其是分页文件,很难做到。在 superuser.com 上询问相关问题

关于c# - 在闲置的应用程序中,是什么导致我的 C#.NET 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2256089/

相关文章:

C++ 内存管理和 vector

c# - Microsoft Word 中的编号列表

c# - 未知服务器标记 'rsweb:ReportViewer'

c# - 具有本地化数据的 ASP.NET MVC GET 表单

c# - ASP.NET MVC Razor 将模型传递给布局

c - HeapReAlloc 改变内存地址后是否应该使用HeapFree?

C# 自动检测代理设置

C# Mysql 线程

c# - 在 asp/.net/mvc 中使用 Datatype.EmailAddress

c++ - C++中的字符串分配