.net System.OutOfMemoryException

x33g5p2x  于 2023-01-03  发布在  .NET
关注(0)|答案(4)|浏览(131)

我试图修复一个旧的、笨重的、复杂的遗留系统的内存泄漏。我追溯了这个问题,描述内存泄漏的最好方法是“设计”。简单地说,有一个事件观察器在对象被放弃后持有对它们的引用。由于这个原因,对象不能被垃圾收集器收集并无限期地留在内存中。
有没有办法获取当前持有示例引用的对象集合?

o7jaxewo

o7jaxewo1#

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

wwtsj6pe

wwtsj6pe2#

不,除非您使用调试器API。
WeakReference类是解决这类问题的一个选择。如果你搜索WeakReference沿着事件,你会发现很多文档都有关于如何科普这个问题的建议。据我所知,它们都不是特别干净,但是它们应该工作得很好。
例如,this page讨论了许多不同的方法。

v2g6jxz6

v2g6jxz63#

您可以尝试通过使用带有Sosex扩展DLL的WinDbg来获得技术信息。如果您不熟悉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
``

请注意,这是一个非常硬的解决方案,这将需要相当多的准备,如果你; We“你是新手,但是,它可以是调试.NET应用程序的一种非常强大的方法。

2nc8po8w

2nc8po8w4#

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

相关问题