我试图修复一个内存泄漏的旧的,笨重的,复杂的遗留系统。我追溯了这个问题,描述内存泄漏的最好方式是“按设计”。简而言之,有一个事件观察者在被抛弃后持有对象的引用。出于这个原因,对象不能被垃圾收集器收集并无限期地留在内存中。System.OutOfMemoryException
有没有办法获得当前持有对实例的引用的对象的集合?
我试图修复一个内存泄漏的旧的,笨重的,复杂的遗留系统。我追溯了这个问题,描述内存泄漏的最好方式是“按设计”。简而言之,有一个事件观察者在被抛弃后持有对象的引用。出于这个原因,对象不能被垃圾收集器收集并无限期地留在内存中。System.OutOfMemoryException
有没有办法获得当前持有对实例的引用的对象的集合?
您可以尝试通过使用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应用程序的一种非常强大的方式。
我不知道这样的方式。
但是 - 在这种情况下,弱引用的集合可能很方便。
看一看here
使用WinDBG。下面是在Tess博客中使用WinDBG的finding memory leaks的示例。
不,除非您使用调试器API。
这类事情的一个选项是WeakReference
类。如果您搜索WeakReference
以及事件,您会发现很多文档,其中包含有关如何处理此问题的建议。从我记忆中来看,它们都不是特别干净,但它们应该工作得很好。
作为示例,this page讨论了许多不同的方法。