2010-07-12 44 views
2

我试图修复一个内存泄漏的旧的,笨重的,复杂的遗留系统。我追溯了这个问题,描述内存泄漏的最好方式是“按设计”。简而言之,有一个事件观察者在被抛弃后持有对象的引用。出于这个原因,对象不能被垃圾收集器收集并无限期地留在内存中。System.OutOfMemoryException

有没有办法获得当前持有对实例的引用的对象的集合?

回答

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应用程序的一种非常强大的方式。

3

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

3

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

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

作为示例,this page讨论了许多不同的方法。

相关问题