0

我正在使用 ANTS 分析器在我的应用程序中分析内存使用情况,它表明 Excell 单元对象在第 2 代中占用了大量内存。应用程序正在使用 EPPlus 库生成 excel 文件。

我附上了该工具生成的一些图表。我不确定如何进一步钻探以找出哪个对象正在持有引用并占用内存。请就如何进一步深入图表提供您的建议。

总结图

实例图_1

实例图_2

在此处输入图像描述

问题是:该图再次指向同一对象。我想我没有正确使用这个工具。

谢谢

4

2 回答 2

0

查看您拍摄的两个快照(来自摘要屏幕),我缺少每个快照的工作流上下文,因此我将做出一些假设:

快照 1:在您创建 Excel 文件之前。快照 2:在您创建 Excel 文件并且您认为此操作已完成之后。

首先,我建议您稍微调整一下您的工作流程并进行以下快照。

快照 1:在创建 Excel 文件之前拍摄。

快照 2/3:取决于应用程序工作流程;如果您创建数据(可以查看它等),则在此数据之后创建一个文件,然后在数据生成后拍摄快照,然后在文件创建后拍摄另一个快照。

最终快照:拍摄一个最终快照 - 这是一种很好的做法,可以在完成工作流程后更好地了解内存中的内容,因为它允许清除终结器队列。

这里不会有答案,因为从几个屏幕截图中很难做到这一点 - 只是建议 - 我不了解您的应用程序,并且对您所需的内存使用情况做出假设,例如缓存数据等。

(a) 使用 Instance Categorizo​​r 视图并选择 Categorized References,您需要从顶部(仅)参考链开始并从右到左工作。再次做出假设(简单化的假设)超越作为 Excel 库一部分的节点,并查看引用它的类。在这一点上,这将给您足够的在代码 (b) 中查找该引用或深入探索 (c) 的起点。(a) 如果你认为这个参考链(从右到左的路径)不值得追求,那么向下移动到下一个。使用 Instance Categorizo​​r 视图,您可以使用 Right-Left、Top-Botton。

(b) 如果您有源代码,您可以右键单击一个节点并浏览到 Visual Studio 中的类。或者自己去那里:>

(c) 通过从 (a) 更深入地探索参考链,我的意思是使用链接“显示此路径上的实例”,然后根据显示的指标(大小、距 GC 根的距离)做出判断,选择一个类的实例来探索更多细节。这将带您进入实例保留图,该图更详细地显示了该实例的参考链。注意这里的工具提示,颜色区域和节点类型都意味着不同的东西。请参阅下面的链接。

我认为从这个答案中可以清楚地看出,您可能会从查看 AMP 文档中受益,因为有很多东西要学习,而且我只和您一起对应用程序进行了非常高级的操作,并且我已经做了很多(远很多) 假设。

请参阅链接以获得一些帮助:

类视图过滤器

实例分类器

实例保留图

大对象堆碎片提示<- 正如其他海报所指出的那样。

Red Gate 的内存分析器学习门户<- 可以查看视频和技术论文部分

我希望这能让你开始。

于 2013-03-11T13:32:33.537 回答
0

首先,作为开发人员,只有您知道这些 Excell 对象是否应该在内存中(例如,外部观察者如何知道这些对象是否是缓存对象)?您可以提供有关是否已在这些对象上调用 Dispose 的信息。

其次,您是否看到它在哪里给了您大对象 hap 碎片的警告?我会先调查一下。

于 2013-03-11T12:45:38.940 回答