Понимание графика, генерируемого профилировщиком ANTS
Я профилирую память в приложении с помощью профилировщика ANTS, и это показывает, что во втором поколении объект ячейки Excell задерживает большой объем памяти. Приложение использует библиотеку EPPlus для создания файла Excel.
Я прилагаю некоторые из графика, созданного инструментом. Я не уверен, как продолжить, чтобы выяснить, какой объект содержит ссылку и съедает память. Пожалуйста, предоставьте свое предложение о том, как углубиться в график.
Проблема в том, что этот график снова указывает на тот же объект. Я думаю, что я не использую этот инструмент должным образом.
Спасибо
2 ответа
Во-первых, только вы, как разработчик, знаете, должны ли эти объекты Excell находиться в памяти или нет (как, например, внешний наблюдатель узнает, были ли они кэшированными объектами или нет)? Вы могли бы представить информацию о том, был ли вызван Dispose для этих объектов, возможно.
Во-вторых, вы видите, где он дал вам предупреждение о фрагментации хапов крупных объектов? Я бы сначала расследовал это.
Глядя на два снимка, которые вы сделали (из сводного экрана), мне не хватает контекста рабочего процесса для каждого снимка, поэтому я собираюсь сделать некоторые предположения:
Снимок 1: до создания файла Excel. Снимок 2: после создания файла Excel и выполнения этого действия.
Во-первых, я бы порекомендовал вам немного скорректировать рабочий процесс и сделать следующие снимки.
Снимок 1: сделано до создания файла Excel.
Снимок 2/3: Зависит от рабочего процесса приложения; если вы создаете данные (можете просматривать их и т. д.), то создайте файл по факту из этих данных, затем сделайте снимок после генерации данных, а затем еще один после создания файла.
Окончательный снимок: сделайте один окончательный снимок - это хорошая практика, чтобы лучше понять, что находится в памяти после завершенного рабочего процесса, поскольку он позволяет очистить очередь финализатора.
Здесь не будет никакого ответа, поскольку это трудно сделать из нескольких скриншотов - просто совет - я ничего не знаю о вашем приложении, и делаю предположения о желаемом использовании памяти, например, кешировании данных и т. Д.
(a) Используя представление "Классификатор экземпляра" с выбранными категоризованными ссылками, необходимо начать сверху (только) ссылочную цепочку и работать справа налево. Снова делая предположения (упрощенные), посмотрите за пределы узлов, которые являются частью библиотеки Excel, и посмотрите, какой класс ссылается на нее. На данный момент это либо даст вам достаточно для поиска этой ссылки в коде (b), либо отправной точкой для более глубокого изучения (c). (a) если вы считаете, что эта цепочка ссылок (путь справа налево) не стоит того, то переходите к следующей. В представлении Instance Categoryoror вы работаете справа налево, сверху вниз.
(б) Если у вас есть исходный код, вы можете щелкнуть правой кнопкой мыши на узле и перейти к классу в Visual Studio. Или просто иди туда сам:>
(c) Изучая цепочку ссылок из (a) глубже, я имею в виду использовать ссылку "Показать экземпляры на этом пути", а затем сделать вывод из отображаемых метрик (размер, расстояние от корня GC), выбрать экземпляр класса, чтобы изучить более подробно. Это приведет вас к Графику хранения экземпляра, который более подробно показывает цепочку ссылок для этого экземпляра. Обратите внимание на всплывающие подсказки, цветные области и тип узла означают разные вещи. Смотрите мои ссылки ниже.
Я думаю, что из этого ответа ясно, что вы, вероятно, выиграете, посмотрев документацию AMP, так как есть чему поучиться, и я только очень подробно изучил приложение с вами, и я сделал много (далеко до многих) предположения.
Смотрите ссылки для некоторой помощи:
Советы по фрагментации кучи больших объектов <- Как указывает другой автор.
Учебный портал Red Gate для профилировщика памяти <- Возможно, посмотрите разделы "Видео" и "Технические документы"
Я надеюсь, что вы начали.