我试图修复一个旧的、笨重的、复杂的遗留系统的内存泄漏。我追溯了这个问题,描述内存泄漏的最好方法是“设计”。简单地说,有一个事件观察器在对象被放弃后持有对它们的引用。由于这个原因,对象不能被垃圾收集器收集并无限期地留在内存中。有没有办法获取当前持有示例引用的对象集合?
o7jaxewo1#
我不知道这样的方式。但是-弱引用集合在这种情况下可能很方便。看一下here
wwtsj6pe2#
不,除非您使用调试器API。WeakReference类是解决这类问题的一个选择。如果你搜索WeakReference沿着事件,你会发现很多文档都有关于如何科普这个问题的建议。据我所知,它们都不是特别干净,但是它们应该工作得很好。例如,this page讨论了许多不同的方法。
WeakReference
v2g6jxz63#
您可以尝试通过使用带有Sosex扩展DLL的WinDbg来获得技术信息。如果您不熟悉WinDbg,请尝试阅读Tess Ferrandez的blog,它是.NET调试信息的金矿。基本上,Sosex.dll有一个!Refs命令,它列出了引用了您给予的特定对象地址的对象。例如:
!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 ``
请注意,这是一个非常硬的解决方案,这将需要相当多的准备,如果你; We“你是新手,但是,它可以是调试.NET应用程序的一种非常强大的方法。
2nc8po8w4#
使用WinDBG。以下是Tess博客中使用WinDBG的finding memory leaks示例。
4条答案
按热度按时间o7jaxewo1#
我不知道这样的方式。
但是-弱引用集合在这种情况下可能很方便。
看一下here
wwtsj6pe2#
不,除非您使用调试器API。
WeakReference
类是解决这类问题的一个选择。如果你搜索WeakReference
沿着事件,你会发现很多文档都有关于如何科普这个问题的建议。据我所知,它们都不是特别干净,但是它们应该工作得很好。例如,this page讨论了许多不同的方法。
v2g6jxz63#
您可以尝试通过使用带有Sosex扩展DLL的WinDbg来获得技术信息。如果您不熟悉WinDbg,请尝试阅读Tess Ferrandez的blog,它是.NET调试信息的金矿。
基本上,Sosex.dll有一个
!Refs
命令,它列出了引用了您给予的特定对象地址的对象。例如:请注意,这是一个非常硬的解决方案,这将需要相当多的准备,如果你; We“你是新手,但是,它可以是调试.NET应用程序的一种非常强大的方法。
2nc8po8w4#
使用WinDBG。以下是Tess博客中使用WinDBG的finding memory leaks示例。