C# 分析巨大的堆转储(超过10 GB)

C# 分析巨大的堆转储(超过10 GB),c#,memory,memory-management,profiling,heap-dump,C#,Memory,Memory Management,Profiling,Heap Dump,我以前见过这个问题,但是回答没有达到我的需要。我正在寻找一种方法来分析使用极高内存量的C应用程序的堆转储 我遇到的一个问题是我使用的工具是x86。一些吸引人的工具VS2013 Ultimate、Antz内存分析器、PerfView就是这样 我也花了一些时间尝试CLR Profiler,但当连接到应用程序时,它似乎不起编辑作用 现在我觉得我唯一的选择就是跳进Windbg。有没有其他工具可以支持这一点 谢谢 我经常使用Windbg。DumpHeap-stat将为您提供良好且快速的结果,以检查哪些对象

我以前见过这个问题,但是回答没有达到我的需要。我正在寻找一种方法来分析使用极高内存量的C应用程序的堆转储

我遇到的一个问题是我使用的工具是x86。一些吸引人的工具VS2013 Ultimate、Antz内存分析器、PerfView就是这样

我也花了一些时间尝试CLR Profiler,但当连接到应用程序时,它似乎不起编辑作用

现在我觉得我唯一的选择就是跳进Windbg。有没有其他工具可以支持这一点


谢谢

我经常使用Windbg。DumpHeap-stat将为您提供良好且快速的结果,以检查哪些对象正在溢出。如果幸运的话,您可以从调用堆栈中得到一条线索,知道是什么在分配如此多的数据

就我个人而言,我更喜欢PerfView,因为它对堆进行采样并存储在.gcDump文件中的速度要快得多,只需要转储所需数据的一小部分。您可以使用PerfView拍摄堆快照并将其发送到HQ,HQ通常比原始转储因子小100。我已经用PerfView分析了高达36 GB的转储,其中有些问题,但Vance Morrison好心地帮助我修复了发生堆栈溢出的堆遍历代码

PerfView可能是x86,但从转储中提取数据的内部HeapDumper当然是64位的


没有任何转储的另一种方法是在PerfView.NET堆中启用Sampl alloc跟踪。通过这种方式,您可以获得所有分配的调用堆栈,从而直接指向正在进行分配的代码

谢谢你的洞察力!在发布这篇文章之后,我决定开始探索Windbg。我能够使用它遍历转储并提取一个.log文件,我可以用CLR分析器打开它。这是一个良好的开端,但却是一个缓慢的过程。下一步,我将返回并给PerfView另一个镜头。我有理由不认为它可以与x64 DMP一起使用,这是我在帮助文本中看到的。