Сборщик мусора в Android работает, но ничто не отображается как выделенное в трекере распределения ddms - PullRequest
3 голосов
/ 04 сентября 2011

В моем приложении я стараюсь не выделять кучу в главном цикле рендеринга, чтобы сборщик мусора не выполнял свою задачу.

После внесения серии изменений в мое приложение,Я неожиданно вижу сборщик мусора, вызываемый каждую секунду или две, и он освобождает около 400 КБ памяти за вызов.

Я оглядываюсь назад на изменения, которые я сделал, и у меня нет никаких явных выделенийпроисходит в потоке рендеринга.Поэтому я запускаю ddms и использую инструмент «Allocation Tracker», но никаких выделений не происходит, кроме обычных, связанных с запуском ddms.И, конечно же, недостаточно выделенных выделений для 400 Кбайт, которые, по-видимому, собирают мусор каждую секунду или около того

Ответы [ 2 ]

7 голосов
/ 04 сентября 2011

(я уже нашел решение, но выкладываю вопрос + ответ в интересах других)

Как оказалось, я смог отследить проблему до вызова метода .values ​​()Класс enum, который выделяет новый массив при каждом вызове.Но по какой-то причине эти распределения не отображаются в трекере распределения ddms, поэтому его довольно сложно отследить.

К счастью, я смог использовать git bisect, чтобы найти конкретное изменение, которое внеслопроблемы, а затем отследил ее до точной проблемы в этом изменении.

Редактировать: После некоторого дополнительного тестирования кажется, что клонирование массива вообще не отображается в трекере выделения.

Дополнительная информация. Похоже, это проблема сота и ниже при клонировании объекта.Это будет исправлено в ICS.(http://code.google.com/p/android/issues/detail?id=19831)

0 голосов
/ 04 сентября 2011

Пожалуйста, предоставьте информацию о типе мусорного коллектора.Распределение растрового изображения, то есть фактические пиксели растрового изображения (не очень точная информация о растровом изображении) выделяется в куче, НО невидимо для любого инструмента отслеживания распределения для версии Android ниже 3.0 (Honeycomp).Поэтому, если вы загружаете растровую информацию, будет вызываться внешнее распределение GC.

...