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

Posted

技术标签:

【中文标题】分析巨大的 C# 堆转储(超过 10 GB)【英文标题】:Analyzing Gigantic C# Heap Dumps (Over 10 GB) 【发布时间】:2014-09-25 19:14:43 【问题描述】:

我以前见过这个问题,但回答并没有满足我的需要。我正在寻找一种方法来分析来自使用大量内存的 C# 应用程序的堆转储。

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

我也花了一些时间尝试 CLR Profiler,但这似乎不起作用(编辑 - 附加到应用程序时工作)。

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

谢谢!

【问题讨论】:

【参考方案1】:

我经常使用 Windbg。一个 DumpHeap -stat 会给你很好和快速的结果来检查哪些对象正在泛滥。如果你幸运的话,你会从调用堆栈中得到一个线索,是什么分配了这么多数据。

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

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

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

【讨论】:

感谢您的洞察力!在发布此内容后,我决定开始探索 Windbg。我能够使用它来遍历转储并提取可以使用 CLR Profiler 打开的 .log 文件。这是一个好的开始,但过程缓慢。接下来我会回去再给 PerfView 一个机会。我有理由认为它不适用于 x64 DMP,我在帮助文本中读到了这一点。

以上是关于分析巨大的 C# 堆转储(超过 10 GB)的主要内容,如果未能解决你的问题,请参考以下文章

分析大型 Java 堆转储 - 内存错误

内存泄漏的java堆和线程分析

如何分析大型jvm转储文件

深入理解Java虚拟机——虚拟机堆转储快照分析工具(jhat)

深入理解Java虚拟机——虚拟机堆转储快照分析工具(jhat)

堆转储分析需要您注意