【问题标题】:System.OutOfMemoryExceptionSystem.OutOfMemoryException
【发布时间】:2010-07-12 14:55:28
【问题描述】:

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

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

【问题讨论】:

    标签: .net memory-leaks


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      此类事情的一个选项是WeakReference 类。如果您搜索 WeakReference 以及事件,您会发现很多文档,其中包含有关如何准确应对此问题的建议。据我所知,它们都不是特别干净,但它们应该工作得相当好。

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

      【讨论】:

        【解决方案3】:

        您可以尝试通过使用带有 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
        ``
        

        请注意,这是一个非常核心的解决方案,如果您是新手,则需要进行相当多的准备工作。但是,它可能是调试 .NET 应用程序的一种非常强大的方法。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2016-08-31
            • 1970-01-01
            • 1970-01-01
            • 2011-02-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多