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

本文关键字:超过 GB 转储 巨大 | 更新日期: 2023-09-27 18:24:37

我以前见过这个问题,但回答没有根据我的需求进行调整。我正在寻找一种方法来分析来自使用极高内存量的C#应用程序的堆转储。

我遇到的一个问题是,我使用的工具是x86。一些有吸引力的工具(VS2013Ultimate、Antz内存分析器、PerfView)就是这样。

我也花了一些时间尝试CLR事件探查器,但这似乎不起作用(连接到应用程序时进行编辑)。

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

谢谢!

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

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

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

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

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