繁体   English   中英

Memory 泄露在.Net

[英]Memory leak in .Net

我想知道 memory 是否真的被泄露了。 我的场景是这样的:

  1. My.Net 应用程序正在占用 x 数量的 memory。
  2. 我打开了一些对话框,现在需要 x+y 数量的 memory
  3. 关闭所有最近打开的对话框
  4. 仍然 memory 在 x + Y 左右

这是 memory 泄漏还是可能是垃圾收集器没有清除 memory 的情况。

并且作为事件也被视为参考。 如果事件出现在取消引用的 object 中怎么办? 那么该事件不会被视为参考,对吗?

垃圾收集器只释放不再引用的对象。

它不会神奇地删除您不再需要的所有对象。

检查您是否仍有对任何对象的引用。 请记住,事件也被视为引用。 (需要知道 object 到 go 到哪个)

Memory 仅在需要时进行垃圾收集,当所谓的第 0 代已满或整个系统 memory 压力足以强制进行垃圾收集时更具技术性。 Memory 出 scope 时不会自动回收。 更多信息在这里这里

只是为了测试,在关闭对话框后(不再引用它之后)尝试调用GC.Collect() ) 以强制 GC 收集任何可用的 memory。

实际上,您应该摆弄垃圾收集器,它经过大量调整以获得最佳性能。

如果您怀疑您确实泄漏了 memory,请使用某种 memory 分析器来分析您的应用程序。

尝试例如RedGates Memory Profiler ,他们有一个基于时间的试验。
按照此演练快速了解要查找的内容和方法。

In.Net 一旦你不引用 object,object 就会被收集回来。 如果您有实时参考,则 object 将保持活动状态。 因此,要找到 memory 泄漏,您需要执行以下操作

  1. 查找对象列表和被占用的 memory
  2. 确定您怀疑现在应该释放的对象。
  3. 找到持有此 object 的根。
  4. 修复根。

您可以使用一些 memory 分析器来执行此操作,也可以使用 WinDbg+sos。 人们觉得 windbg 很难使用,但对于这些情况,windbg+sos 更容易使用并且是免费的。 修复泄漏后,您也会感到高兴。 您将成为那些总是喜欢免费强大工具的人之一。

看看这个链接。

http://blogs.msdn.com/b/ricom/archive/2004/12/10/279612.aspx

http://blogs.msdn.com/b/delay/archive/2009/03/11/where-s-your-leak-at-using-windbg-sos-and-gcroot-to-diagnose-a-net-内存泄漏.aspx

如何使用 memory 分析工具(例如JetBrains dotTrace )来分析您的应用程序的 memory 使用情况?

可能是垃圾收集器没有清除 memory

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM