Как отследить утечку памяти - найти живые ссылки - PullRequest
0 голосов
/ 28 января 2011

У меня довольно сложное приложение -

Активность пользовательского интерфейса запускает службу и настраивает 2-сторонние обратные вызовы AIDL, чтобы они могли обмениваться данными.

Служба работает вечно (если не отключится)кнопка в пользовательском интерфейсе).

Проблема в том, что когда пользователь выходит из действия, память действия не освобождается.- Объем памяти, используемой моим приложением, остается неизменным, даже если действие пользовательского интерфейса было закрыто.-Куча по-прежнему показывает mapTiles и прочее дерьмо пользовательского интерфейса на нем, даже если действие пользовательского интерфейса было закрыто.

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

Есть ли способ найти то, что конкретно ссылается на Activity?Дерево доминирования показывает макеты mapTiles и ListView, которые поглощают всю мою память ... но я не могу найти ссылку на Activity, которая поддерживает эти вещи.

Кроме того, есть способ выгрузитьвещь дампа кучи HPROF, если возникает OutOfMemoryException?

Ответы [ 2 ]

0 голосов
/ 28 января 2011

Если не вы сами держите ссылку («ссылается на активность через слабую ссылку, хранящуюся в области действия приложения», вы обнуляете ее? ты пытался выполнить ГК? Пока памяти достаточно, gc не будет перемещать мусор.

0 голосов
/ 28 января 2011

Проблема в том, когда пользователь выходит из Активность, активность памяти нет освобожден.

В Android нет "Активности выхода". Вызов finish () или повторное нажатие на действие не удаляет объекты из памяти, которые использовало действие. Android сам по себе позаботится об этом в какой-то случайный момент в будущем.

Если вы хотите, чтобы ваши объекты были освобождены из памяти в момент завершения действия , вам необходимо вручную освободить их.

Редактировать: класс, который можно использовать для поиска использования памяти, является ActivityManager .

...