Memory management 如何查找应用程序的内存泄漏?

Memory management 如何查找应用程序的内存泄漏?,memory-management,.net,memory-leaks,Memory Management,.net,Memory Leaks,我使用.NET技术编写了一个windows服务。我正在使用“JetBrains dotMemory”工具来了解内存泄漏 我得到下面的报告,但作为一个新的蜜蜂,我不知道如何阅读这篇文章 系统名称空间显示更多幸存字节。但是,我如何知道哪些代码是内存泄漏的根本原因呢?内存泄漏的一个来源是未被取消引用的事件处理程序 例如: myClass.DoSomething+=事件 您需要确保资源被清除,如下所示: myClass.DoSomething-=Event_DoSomething您应该查看幸存字节/保留

我使用.NET技术编写了一个windows服务。我正在使用“JetBrains dotMemory”工具来了解内存泄漏

我得到下面的报告,但作为一个新的蜜蜂,我不知道如何阅读这篇文章


系统名称空间显示更多幸存字节。但是,我如何知道哪些代码是内存泄漏的根本原因呢?

内存泄漏的一个来源是未被取消引用的事件处理程序

例如: myClass.DoSomething+=事件

您需要确保资源被清除,如下所示:


myClass.DoSomething-=Event_DoSomething

您应该查看幸存字节/保留字节,这些字节将指向创建的基本实例或根对象。是否保留内存中的指定对象取决于应用程序的设计和实现

如果标识了创建的根对象,则应尝试分离链接,并使.net垃圾收集器自动收集不需要的对象

没有固定的标志点来识别内存泄漏


首先,您应该决定您将发现哪种类型的内存问题

不断增长的内存消耗—获取基本快照,在内存消耗增加后获取另一个快照,打开快照比较,打开第一个快照后创建的新对象,查看它们以了解应该收集哪些对象

确保某些关键对象不会泄漏-将应用程序设置为不应在内存中显示某些对象的状态,例如,关闭某些视图,获取快照,使用“按类型分组”视图上的过滤器以确保此对象不显示在内存中

内存流量-获取基本快照(如果需要),在要检查的应用程序中运行操作/算法,获取快照。打开内存流量视图,查看它是否与您实现的一样,或者在操作期间分配了预期的更多对象

对于其他可能的内存问题

另外,只有作为应用程序作者的你才能回答这个问题,这是一个问题还是设计的问题

亲自使用,没有什么比这更好的。