【问题标题】:How do I find memory leak of my application?如何找到我的应用程序的内存泄漏?
【发布时间】:2018-09-05 05:03:28
【问题描述】:
我使用 .NET 技术编写了一个 Windows 服务。我正在使用“JetBrains dotMemory”工具来了解内存泄漏。
我收到以下报告,但作为一个新蜜蜂,我不知道如何阅读。
System 命名空间显示更多幸存字节。但是我怎么知道哪个代码是内存泄漏的根本原因呢?
【问题讨论】:
标签:
memory-management
.net
memory-leaks
【解决方案1】:
您应该查看将指向基本实例或创建的根对象的幸存字节/保留字节。这取决于您的应用程序设计和实现来决定是否应保留内存中的指定对象。
如果你确定创建的根对象,你应该尝试分离链接并让.net垃圾收集器自动收集不需要的对象。
没有固定的标志点来识别内存泄漏。
【解决方案2】:
首先你应该决定你要找到哪种内存问题
-
不断增长的内存消耗 - 获取基本快照,内存消耗增加后获取另一个,打开快照比较,打开第一个快照后创建的新对象,查看它们以了解应该收集哪些。
确保某些关键对象不会泄漏 - 将您的应用程序设置为某些对象不应出现在内存中的状态(例如关闭某些视图),获取快照,在“按类型分组”视图上使用过滤器以确保此对象不在内存中。
内存流量 - 如果需要,获取基本快照,在您想要检查的应用程序中运行操作/算法,获取快照。打开“内存流量”视图,查看它是否看起来像您实现的那样,或者在操作期间分配了比您预期更多的对象。
Grab this free book 其他可能的内存问题。
附:只有您作为应用程序作者才能回答这个问题,它是一个问题还是它的设计。
【解决方案3】:
内存泄漏的一个来源是未取消引用的事件处理程序。
示例:
myClass.DoSomething += Event_DoSomething
您需要确保资源被清除,如下所示:
myClass.DoSomething -= Event_DoSomething