【问题标题】:Determining where object allocations for objects on the heap occurred确定堆上对象的对象分配发生在哪里
【发布时间】:2011-09-19 16:12:13
【问题描述】:

是否有任何工具可以从正在运行的应用程序中获取堆转储,并根据对象在源代码中的创建位置确定/分组对象?

无需更改源代码,最好是免费的。

【问题讨论】:

    标签: c# .net performance garbage-collection profiling


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      您需要一个 .NET 内存分析器。这些工具允许您跟踪垃圾收集堆上的对象图,并且在识别内存泄漏的来源方面非常有用。虽然它们不一定会告诉您创建对象的方法,但它们会告诉您哪些类的哪些实例保留了对象,并允许您获取 gc 堆快照的差异。它们不需要修改源代码。你可能想看看 What Are Some Good .NET Profilers?

      【讨论】:

        【解决方案3】:

        正如其他人建议的内存分析器,Memprofiler 绝对是最先进的一个(我已经尝试了所有现有的 .NET 分析器)。它有 14 天的试用期。

        【讨论】:

          【解决方案4】:

          如果您创建内存转储,则该信息不可用。为了收集这些信息,您必须在进程运行时对其进行监控。您可以通过 WinDbg 启动应用程序并在您感兴趣的所有构造函数上设置断点(希望您不想查看每个对象)。

          如果您创建断点,那么它会转储堆栈,您将拥有对象的创建点。但是,请记住,在 GC 期间对象可能会四处移动,这将使使用堆栈的对象变得困难(在某些情况下甚至是不可能的)。

          由于您的问题被标记为性能和分析,我推测您希望减少内存分配。为什么不通过查看堆来查看创建的对象数量(或者可能查看创建的最大对象)。然后查看源代码并找出创建此类实例的位置。

          【讨论】:

            【解决方案5】:

            好老的windbg + sos + pdb 会做倾销。 至于“在源代码中创建它们的位置”部分 - 没有检测或注入是不可能的。

            【讨论】:

              【解决方案6】:

              当我们遇到瓶颈时,我们的 QA 团队会在这里使用 http://www.jetbrains.com/profiler/ 来处理这种事情。我很确定它会通过方法调用为您提供分配列表。我会去安装它并检查:)

              【讨论】:

                【解决方案7】:

                例如,来自 ANTS 的 .NET Memory Profiler 怎么样。 也许是 CLR Profiler。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2021-04-30
                  • 2021-11-28
                  • 2010-12-10
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-01-25
                  • 1970-01-01
                  相关资源
                  最近更新 更多