Подтвердить что ты не робот

Android: отслеживание количества созданных объектов

Я портирую игру на Android (там много кода, и очень немногие из них мои), и DalvikVM рассказывает мне (через LogCat) о сборке мусора. В какой-то момент кода я получаю поток сообщений "GC freed x objects/x ms", в основном информируя меня о том, что ~ 150 000 объектов только что были удалены, и он занимает полную секунду.

Я хочу знать, откуда они взялись! Я уверен, что я не намеренно создаю много объектов.

Итак, есть ли способ получить... в основном противоположность этому сообщению? Что-то, что печатает сообщение журнала при создании любого объекта?

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

Я использую Eclipse 3.4.2, если это релевантно.

Любые идеи?

4b9b3361

Ответ 1

Это возможно, используя инструмент ddms, который поставляется с Android (а не версия Eclipse). Используя это, посмотрите вкладку отслеживания распределения. Вы можете начать отслеживать распределения всех объектов вместе со стековыми следами, где они были выделены. Тем не менее, этот инструмент может генерировать информацию-информацию, и конкретная информация, которую вы хотите, не всегда легко разобрать или найти. Если у вас есть версия для Sun JVM, я бы рекомендовал использовать инструменты Kai, они намного более развиты. Если вам нужно сделать это в Android, использование трекера выделения даст вам начало.

Ответ 2

Почему бы вам не профилировать существующий игровой код на Sun JVM (если вы портируете Java-игру)? Затем вы можете воспользоваться JProfiler, Yourkit и т.д. И посмотреть, какой огромный набор объектов очищается. (Используйте -XX: + PrintGCDПодробнее, чтобы увидеть, как GC работает, когда его искать.)

Если окажется, что вы не играете в игру, вы безболезненно поняли это и можете обратить ваше внимание на ваш Android-код. И, к сожалению, я мало что знаю.