Добрый день.
Я делаю небольшое приложение на базе 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 и о том, что это показывает.