2012-04-17 5 views
0

Я пытаюсь найти утечки памяти в довольно большом приложении Flex, и я устал от использования ничтожных инструментов, которые предоставляет Flash Builder.Можно ли отслеживать ссылки между объектами во Flash, так же, как и профилировщик Flash Builder?

В частности, я хочу проанализировать отношения объектов в памяти, используя ту же информацию, к которой имеют доступ инструменты инструмента Flash Builder. То есть какие объекты находятся в памяти и на каких объектах они ссылаются, и имеют ссылки на них. Учитывая эту информацию, я хочу построить ориентированный граф, узлы которого являются живыми объектами, а ребра - ссылками от одного объекта к другому. Оттуда я хочу найти dominators, что должно быть хорошим показателем того, какие объекты протекают.

Я считаю, что Eclipse делает что-то похожее на Java.

К сожалению, Flash Builder позволяет экспортировать только полученные данные профилирования в двоичную форму, которая только обрабатывается Flash Builder. Вместо того, чтобы пытаться перепроектировать их вывод, я решил попытаться захватить данные самостоятельно, так как они делают свой API профилирования доступным в пакете flash.sampler.*.

До сих пор мне удалось собрать объекты, которые в настоящее время живут в памяти, получить их трассировки выделения и ссылки на объекты, которые я могу проверить, и это самое то, что мне нужно. Но я не могу понять, как профилировщик FB отслеживает обратные ссылки на корень GC. Единственный способ, которым я могу это сделать, - проверить каждый объект в памяти и каждый объект проверить каждый из его свойств и т. Д., Пока не найду цепочку для объекта, классифицированного как «корневой» уровень. Но поскольку я могу только следовать рекомендациям по общедоступным свойствам, вполне возможно, что я пропущу множество ссылок, которые предотвращают сбор мусора.

Как работает профилировщик Flash Builder?

Мое подозрение заключается в том, что он не просто использует сэмплер. * API для сбора информации, но дополняет это запросами, выполняемыми через соединение отладчика, что, вероятно, не подходит для моей работы. Но в отсутствие какого-либо способа проверить это, я надеюсь, что это возможно, используя только API-интерфейс Sampler.

ответ

1

На самом деле в ИМХО, если Flash (Flex) Builder имеет встроенную память/производительность инструмента paltry, то вы не используете его правильно. Ключ к пониманию инструментария, который у вас есть, был доступен с 4,0 SDK, и я использовал его для каждого проекта, которому я был назначен как «анализатор времени исполнения».

Live View:
Мы все знаем об этом, это дает вам «вживую», представление о том, в настоящее время. Хотя текущий счетчик экземпляров полезен, еще более полезен кумулятивный. Это помогает отслеживать ошибочные методы, которые создают слишком много объектов.

Праздношатание Объект Вид:
Вы, вероятно, не используя этот, но поверьте мне, как только вы делаете, вы не будете возвращаться. При этом он помогает четко определить небольшие состояния экрана/приложения (например, 1. Начальная точка, 2. Возможность создания диалога 3. Точка закрытия, которая равна состоянию 1). В своем приложении перейдите в место, где вы хотите протестировать. Затем нажмите моментальный снимок памяти функция - значок «цветные линии». Теперь в вашем приложении выполните шаги 2 и 3. Вернитесь к профилировщику и нажмите еще раз. Здесь вы можете либо прекратить или приостановить ваше приложение. Выберите оба профиля памяти и нажмите функцию loitering object - «зеленый значок». Теоретически этот список будет пустым, но это не будет.Это показывает, какие объекты были отмечены для [sweep], но не [reap] 'ed.

D-Click любой объект, и это дает вам подробное представление со списком всех ссылок, которые все еще хранятся на этом объекте. Я дам вам подсказку прямо сейчас, если вы не создали процесс деконструкции в своем приложении (например, IDestroyable interface), остановитесь прямо сейчас и вернитесь и сделайте это. Вы должны назначить нуль для каждого объекта, который не является сложным примитивным. Это означает каждый класс, каждый массив, вектор, eventlistener и т. Д.

Пакет пробоотборника - единственное, что использует инструмент, насколько мне известно - ведь инструмент не вводит какой-либо код в ваше приложение во время вызова. Это сравнение всех объектов с NewObjectSample и DeletedObjectSample и просмотр getSavedThis(), возвращающего цепочку прототипов (это должно вернуть объект, на который вы можете называть getSavedThis() и т. Д.).

http://help.adobe.com/en_US/flashbuilder/using/WS6f97d7caa66ef6eb1e63e3d11b6c4d0d21-7edf.html

Надеется, что это помогает.

+0

Спасибо, Майк, я действительно хорошо знаю, как работает инструмент loitering objects. Я все еще считаю это ничтожным инструментом, потому что он даст мне цепочки объектов, сохраняющих какой-либо экземпляр одного целевого объекта, - и в любом нетривиальном приложении их будет много - но не выполняйте никакого дальнейшего анализа. Если у меня есть 1000 законных цепей объектов и 1, которые не должны быть там, мне бы очень хотелось узнать об этом, и один из способов сделать это - проанализировать ссылки на объекты памяти в доминантах. –

Смежные вопросы