C# 确定堆上对象的对象分配发生在何处

C# 确定堆上对象的对象分配发生在何处,c#,.net,performance,garbage-collection,profiling,C#,.net,Performance,Garbage Collection,Profiling,是否有任何工具可以从正在运行的应用程序中获取堆转储,并根据源代码中创建对象的位置确定/分组对象 无需更改源代码,理想情况下是免费的。例如,ANTS的.NET内存分析器如何。 可能是CLR事件探查器。当我们遇到瓶颈时,我们的QA团队会使用这种方法。我很确定它将通过方法调用为您提供一个分配列表。我会去安装并检查:)好的旧windbg+sos+pdb将进行转储。 至于“它们在源代码中的何处创建”部分,如果没有检测或注入,则不可能实现。如果创建内存转储,则信息不可用。为了收集这些信息,您必须在流程运行时

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


无需更改源代码,理想情况下是免费的。

例如,ANTS的.NET内存分析器如何。
可能是CLR事件探查器。

当我们遇到瓶颈时,我们的QA团队会使用这种方法。我很确定它将通过方法调用为您提供一个分配列表。我会去安装并检查:)

好的旧windbg+sos+pdb将进行转储。
至于“它们在源代码中的何处创建”部分,如果没有检测或注入,则不可能实现。

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

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


由于您的问题带有性能和分析标记,我推测您希望减少内存分配。为什么不通过查看堆来查看创建的对象数(或者可能查看创建的最大对象数)。然后浏览源代码,找出这些实例是在哪里创建的

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

您需要一个.NET内存分析器。这些工具允许您跟踪垃圾收集堆上的对象图,在识别内存泄漏源时非常有用。虽然它们可能不一定告诉您对象是在哪里创建的,但它们会告诉您哪些类的实例保存在对象上,并允许您获取gc堆快照的差异。它们不需要修改源代码。你可能想看看 调试扩展

如何使用: