【问题标题】:Understanding graph generate by ANTS profiler了解 ANTS profiler 生成的图形
【发布时间】:2013-02-26 07:09:40
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: c#-4.0 redgate red-gate-ants


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。看着我附上的第一个 grpah,它说最大的片段大约是 41.17 MB(空闲内存的 27.4%)。我想了解是不是太过分了?我应该担心这个数字吗?如果是,我的下一步应该是什么?谢谢
    • 我现在只能说 - 可能不会。继续观察随着时间的推移会发生什么。如果内存没有随着时间的推移慢慢增加,那你没问题,但如果确实如此 - 开始考虑泄漏。该工具会告诉您为什么对象仍在内存中(当它们可能不应该存在时)。不过,这更像是一门艺术而不是一门科学;)
    【解决方案2】:

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

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

    首先我建议你稍微调整一下你的工作流程并做以下快照。

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

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

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

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

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

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

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

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

    查看链接获取帮助:

    Class view filters

    Instance Categorizor

    Instance retention graph

    Large object heap fragmentation tips

    Red Gate's learning portal for the Memory profiler

    我希望这能让你开始。

    【讨论】:

    • 感谢您的快速回复和解释所有事情。第一个图像只是一个摘要图像,它告诉我生成文件后 ExcelCell 正在使用 61 MB。接下来的 3 个图像是对象图的一部分,它被分成 3 个(从右到左)。问题是,在我进一步钻探(从右到左)后,它显示了相同的对象。我希望系统会指出包含所有引用的最终对象。只是想检查我是否朝着正确的方向前进。
    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 2012-12-24
    • 2021-10-03
    • 2019-10-02
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多