确定堆上对象的对象分配发生的位置

时间:2011-06-21 15:54:16

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

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

源代码没有变化,理想情况下是免费的。

7 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

当我们遇到瓶颈时,我们的QA团队会在此处使用http://www.jetbrains.com/profiler/来处理此类问题。我很确定它会通过方法调用给你一个分配列表。我会安装它并检查:)

答案 5 :(得分:0)

好旧的windbg + sos + pdb将进行倾销。 至于“创建源代码的地方”部分 - 没有仪器或注入就不可能。

答案 6 :(得分:0)