5

Я получаю случайные (из памяти) сбои в моем приложении, поэтому начал анализировать свою кучу. Я заметил, что если перейти от Activity A к Activity B, куча увеличивается (из-за ленивой загрузки многих изображений) от 27 МБ до 35 МБ. Однако, когда я завершаю() активность B, чтобы вернуться к Activity A, размер кучи остается неизменным даже при работе GC!Куча памяти приложений для Android продолжает расти

Досадно, что переход к активности B еще раз увеличивает кучу до 42 МБ. Я могу сделать это, как могут времена, и куча будет только увеличиваться.

Это ленивые изображения Загрузка библиотеки, которые я использую:

LazyList https://github.com/thest1/LazyList

Эти скриншоты кучного

перед: http://i.stack.imgur.com/7eTzm.png

после: http://i.stack.imgur.com/txeC6.png

конвертированы Файл дампа кучи доступен по запросу

UPDATE

С моей отладки, кажется, вопрос из библиотеки LazyList, но я до сих пор не уверен на 100%. Вот ссылка на людей, комментирующих библиотеке:

https://github.com/thest1/LazyList/issues/20

+0

Похоже, что ваша деятельность просачивается некоторыми данными. Есть ли у вас переменные-члены IPC или что-то еще, что может продолжаться без активности? –

+0

Нет IPC Для продолжения без активности библиотека, которую я использую, использует несколько потоков (какой автомобиль работает без активности). – AlAsiri

+0

вы разрешаете эту проблему, тогда пожалуйста, обратная связь ожидается. –

ответ

1

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

Если этого недостаточно, посмотрите на свой hprof и посмотрите, какие крупные объекты стоят вокруг после того, как вы убили активность и кто держит ссылки. Исправить и повторить.

+0

Как вы меняете регистрацию вызова ОС, требующего передачи контекста? Не могли бы вы показать мне пример? – AlAsiri

+0

Где вы используете контекст? Если это внутри слушателя, вам может понадобиться избавиться от него. Но в целом, я не думаю, что вам нужно, чтобы вы также сохраняли ссылку с Activity A на Activity B, например, когда-либо. – dmon

+0

Я согласен с этим. Но его нередко передавать объекты Контекста слушателям или объектам данных, которые хранят их как переменные-члены, и если вы не обнулите их, вы будете течь. Его даже не редкость, чтобы потом потом решить, чтобы эти переменные синглтоны или глобалы, не думая об этой переменной контекста, лежащей вокруг (черт возьми, она даже может быть передана в конструктор какого-либо другого объекта, который это делает, но у вас есть только исходный объект, лежащий вокруг). Общие причины для этого - доступ к таким вещам, как SharedPreferences или классы XXXManager. –

1

Звучит так, как будто вы начинаете новую деятельность каждый раз, вместо того, чтобы переключаться на уже загруженную. Попробуйте установить флаги в намерении включить Intent.FLAG_ACTIVITY_REORDER_TO_FRONT при переключении действий.

See this

+0

попробовал флаг, но все же. Я считаю, что это не проблема. – AlAsiri

+0

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

0

Кажется мне, это может быть изображения, которые вы используете. BitmapFactory from Android создает неизменяемые растровые изображения, и любые изменения, внесенные вами в эти растровые изображения, будут поэтому отделены от исходного изображения.

Хуже того, даже если вы сообщите об этом recycle, это будет зависеть от ваших ссылок, если оно будет собрано в мусор.

+0

Я тоже так думаю Вы думаете, что SoftRefrence решит эту проблему? – AlAsiri

+0

Я был бы более склонен использовать совет, предлагаемый здесь: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html. Это здесь: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html кажется особенно актуальным. – DigCamara

Смежные вопросы