为System.OutOfMemoryException

时间:2010-07-12 14:55:29

标签: .net memory-leaks

我正在尝试修复一个旧的,笨重的,复杂的旧系统,内存泄漏。我已经追溯了这个问题,描述内存泄漏的最好方法是它“按设计”。简单来说,有一个事件观察者在被遗弃之后持有对象的引用。因此,垃圾收集器无法收集对象并无限期地保留在内存中。

有没有办法获取当前包含对实例的引用的对象集合?

4 个答案:

答案 0 :(得分:3)

我不知道这样。
但是 - 在这种情况下,收集弱引用可能很方便 看看here

答案 1 :(得分:3)

不,除非您使用调试器API。

这类事情的一个选择是WeakReference类。如果您搜索WeakReference以及事件,您会发现很多文档,其中包含有关如何正确处理此问题的建议。根据我的记忆,它们都不是特别干净,但它们应该合理地工作。

例如,this page讨论了许多不同的方法。

答案 2 :(得分:1)

使用WinDBG。以下是在Tess博客中使用WinDBG的finding memory leaks示例。

答案 3 :(得分:1)

您可以尝试使用WinDbg和Sosex扩展DLL来获取技术。如果您不熟悉WinDbg,请尝试阅读Tess Ferrandez的blog,这是.NET调试信息的金矿。

基本上,Sosex.dll有一个!Refs命令,该命令列出了对您提供的特定对象地址的引用的对象。例如:

Usage:
!refs <hexObjectAddr>

Lists all references held by the specified object
Lists all references to the specified object (searches heaps, stacks, registers, handle tables and the freachable queue)

Refs are listed in the following format:
hexAddr decSize strTypeName

Sample output:
0:000> !sosex.refs 7fff2970
Objects referenced by 7fff2970:
7fff1100         64 System.IO.__ConsoleStream
7fff1388        136 System.Text.SBCSCodePageEncoding
7fff2c50         48 System.Text.DecoderNLS
7fff2c80        280 System.Byte[]
7fff2d98        536 System.Char[]
7fff1140         24 System.Byte[]

Objects referencing 7fff2970:
7fff2fb0         32 System.IO.TextReader+SyncTextReader
``

请注意,这是一个非常核心的解决方案,如果您需要做一些准备工作,请重新开始。但是,它可以是调试.NET应用程序的一种非常强大的方法。