2010-11-03 4 views
0

мое приложение для приложений Android низкое. от logcat я обнаружил, что многоразовый фактор - сбор мусора. он потребляет по крайней мере 110 мс в каждом gc. gc показывает часто. Есть ли способ определить собранные объекты?android определить GC освобожденный объект

+0

Это в эмуляторе или на реальном телефоне? – Khalos

+0

Надеюсь, что вы не используете класс времени выполнения для бесплатного gc вручную в любом месте – DeRagan

+0

@khalos это реальный телефон – asifkt

ответ

1

Отъезд видео в http://developer.android.com/videos/index.html

особенно тот разговор на «Сделайте свой UI быстрее», есть много дизайна лучшие практики, показанные в видео.

Это, безусловно, поможет вашему приложению работать быстрее.

+0

В моем приложении мне нужно разобрать xml-файл, загруженный с сервера , для синтаксического анализа данных из каждого тега я использовал метод, показывающий ниже открытых пустых символов (символ сп [], Int начала, длина Int) { \t \t \t \t \t, если (in_mapData) { \t \t, если (this.in_evtUrl) {\t myXmlDataSet.setExtractedEvtUrl (новая строка (ch, начало, длина)); } этот метод вызывается для каждого чтения содержимого тега. Является ли это причиной сбора мусора, поскольку я часто использую новый метод String()? если да, дайте мне подзаголовок этому методу. – asifkt

+0

Вам нужно будет проследить свои методы, чтобы проверить, что генерирует мусор. Его действительно трудно найти, только с кодом. Вы можете попробовать использовать другую синтаксическую разборку. – srinathhs

+0

Я использовал класс, который расширяет DefaultHandler для обработки xml-обработки. читая данные xml, я получаю массив char. Для получения строки я должен преобразовать ее в строку, вызвав новый метод String().Я думаю, что это причина GC.If, я получаю данные как строку, я могу решить эту проблему ??? то это класс разбора xml для получения данных в виде строки. Я использую HTC wildfire с Android 2.1. – asifkt

1

Это не странное значение для Android GC. Значения ~ 100 мс и ~ 500К являются довольно средними, но, конечно, это зависит от спецификаций проекта. Реальная проблема заключается в частоте, которую ваш код вызывает вызов GC.

Вот пример: если вы реализуете списки через ListView и некоторые пользовательские Adapters, вы можете получить наихудшую производительность и лучше всего в зависимости от того, как вы пишете свой код для них. Если вы не оптимизируете списки и не создаете новый вид (путем раздувания его из файла .xml), вы будете получать вызовы GC очень часто, и это воспринимается как небольшие зависания или зависания в пользовательском интерфейсе.

Лучшим методом определения того, что вызывает проблему GC, является его локализация. Запустите приложение и используйте его в одной части одновременно, отслеживая DDMS для GC gumps, а затем посмотрите, какой элемент или Activity вызывает большинство из них и оттуда.

Также попробуйте мониторинг использования памяти с помощью некоторых инструментов. Например, если вы используете Eclipse, есть инструмент с именем MAT, который даст вам немного больше информации об использовании объектов во всем вашем проекте.

2

В инструменте DDMS перейдите на вкладку «Отслеживание распределения». Выберите свое приложение из списка и нажмите «Начать отслеживание». После использования приложения для бит выберите «Получить распределения».

Это покажет вам список из 512 последних распределений с размерами и стеками стека. Из этого вы должны быть в состоянии сказать, что ест память и вызывает GC.

+0

В моем приложении для каждого действия касания вызывается новый внутренний класс, который расширяется AsyncTask. Должен ли я построить новый класс при каждом касании? если я создаю внутренний класс как статический и вызову этот класс вместо вызова «new class.execute (parameter)», я могу повысить производительность? – asifkt

+0

Не знаю. Вы можете открыть для этого новый вопрос. – fadden

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