Android DDMS и отслеживание распределения - определение причины и причины запуска GC - PullRequest
2 голосов
/ 14 декабря 2010

Добрый день.

Я делаю небольшое приложение на базе openGL для Android, которое зацикливается на нормальных 60 кадрах в секунду и делает разные удивительные вещи.

Я следил за частотой кадров и пытался оптимизировать, где это возможно, по мере продвижения. Недавно я заметил, что во время работы моей программы иногда возникает небольшая пауза. Я сразу заподозрил, что это может быть сборщик мусора, работающий и просматривающий в LogCat, что несколько подозреваемых GC появляются во время провалов в fps.

Однако я не уверен, что именно мое приложение вызывает сборы.

Итак, вот мои вопросы о ГК:

1) Когда я получаю логи от LogCat, он содержит PID (идентификатор процесса?), И вот пример типичного GC, который я получаю:

12-14 14:52:40.647: DEBUG/dalvikvm(492): GC_EXPLICIT freed 3831 objects / 203576 bytes in 32ms

492 - это PID. Будет ли этот PID процесса, который выполняет GC? Или это процесс, работающий на телефоне, который также нуждается в GC?

Например, в том же сеансе есть журнал из моего приложения, использующего Log.debug:

12-14 13:50:42.717: DEBUG/Curve(2298): LIFECYCLE - OnStart

PID для моего приложения не 492, а 2298. Значит ли это, что GC не был вызван моим приложением?

С помощью трекера выделения у меня очень мало выделений. Несколько строк журналирования приводят к тому, что некоторые строки генерируются, и случайный Rect генерируется при нажатии пользователем (я исправил это, так что теперь он будет выделен только один раз ...). Поэтому я не могу видеть, как само мое приложение будет генерировать нужен для GC.

2) Если мое приложение не выделяется, а просто является каким-то другим процессом, который счастливо поглощает память, должно ли это вообще повлиять на мое приложение?

3) Может ли тот факт, что я использую ddms, вызвать GC?

4) Когда я смотрю на трекер выделения, появляются некоторые записи, которые не взяты из кода, который я запускаю / прохожу сам. Один из них был связан со статистикой потоков, это может быть ddms?

Извините, если это действительно несколько вопросов, но все это действительно связано с тем, действительно ли журналы GC, которые я вижу в моем LogCat, из моего приложения или нет.

Имея в виду, что в данный момент мой телефон не запущен, мое приложение работает, и я все еще получаю маленькие GC 5 - 15 секунд. Они обычно работают в течение 33 мс и, кажется, довольно мало памяти. Итак, я думаю, это означает, что они не из-за меня. - Опять в основном о PID и о том, что это показывает.

1 Ответ

3 голосов
/ 14 декабря 2010

Вы правы на 1).Только подмножество журналов GC с Logcat принадлежит вашему приложению, и у них есть pid вашего приложения.

Скорее всего, ошибки происходят из-за фоновых служб, запрашивающих небольшие выделения.Я бы посоветовал вам применить фильтр низких частот к разнице времени между кадрами в вашей игре или ограничить максимальный FPS для более плавного восприятия.Даже на iOS крайне сложно, чтобы ваша игра работала со скоростью 60FPS без возможных сбоев.

...