【发布时间】:2011-09-19 16:12:13
【问题描述】:
是否有任何工具可以从正在运行的应用程序中获取堆转储,并根据对象在源代码中的创建位置确定/分组对象?
无需更改源代码,最好是免费的。
【问题讨论】:
标签: c# .net performance garbage-collection profiling
是否有任何工具可以从正在运行的应用程序中获取堆转储,并根据对象在源代码中的创建位置确定/分组对象?
无需更改源代码,最好是免费的。
【问题讨论】:
标签: c# .net performance garbage-collection profiling
【讨论】:
您需要一个 .NET 内存分析器。这些工具允许您跟踪垃圾收集堆上的对象图,并且在识别内存泄漏的来源方面非常有用。虽然它们不一定会告诉您创建对象的方法,但它们会告诉您哪些类的哪些实例保留了对象,并允许您获取 gc 堆快照的差异。它们不需要修改源代码。你可能想看看 What Are Some Good .NET Profilers?
【讨论】:
正如其他人建议的内存分析器,Memprofiler 绝对是最先进的一个(我已经尝试了所有现有的 .NET 分析器)。它有 14 天的试用期。
【讨论】:
如果您创建内存转储,则该信息不可用。为了收集这些信息,您必须在进程运行时对其进行监控。您可以通过 WinDbg 启动应用程序并在您感兴趣的所有构造函数上设置断点(希望您不想查看每个对象)。
如果您创建断点,那么它会转储堆栈,您将拥有对象的创建点。但是,请记住,在 GC 期间对象可能会四处移动,这将使使用堆栈的对象变得困难(在某些情况下甚至是不可能的)。
由于您的问题被标记为性能和分析,我推测您希望减少内存分配。为什么不通过查看堆来查看创建的对象数量(或者可能查看创建的最大对象)。然后查看源代码并找出创建此类实例的位置。
【讨论】:
好老的windbg + sos + pdb 会做倾销。 至于“在源代码中创建它们的位置”部分 - 没有检测或注入是不可能的。
【讨论】:
当我们遇到瓶颈时,我们的 QA 团队会在这里使用 http://www.jetbrains.com/profiler/ 来处理这种事情。我很确定它会通过方法调用为您提供分配列表。我会去安装它并检查:)
【讨论】:
例如,来自 ANTS 的 .NET Memory Profiler 怎么样。 也许是 CLR Profiler。
【讨论】: