У меня утечка приложения для Android, что я должен проверить?
Я взглянул на то, чтобы избежать утечек памяти, и добавил некоторые вызовы unbindDrawables() в методах onDestroy() для действий по очистке, но ничего не изменилось. Я также заменяю все вызовы getContext() методом getApplicationContext(), но ничего не изменилось.
Я отслеживаю размер кучи в перспективе затмения DDMS: когда я запускаю приложение в первый раз, там выделено 3 Мб, а после 10 закрытия/перезапуска его выделяется 10 Мб.
Мои взгляды состоят в основном из ViewFlippers и многих вложенных макетов, которые наследуются от подкласса LinearLayout.
РЕДАКТИРОВАТЬ:
после запуска MAT для идентификации подозреваемых в утечке основная проблема:
16 instances of "org.apache.http.impl.conn.tsccm.ConnPoolByRoute",
loaded by "<system class loader>" occupy 4,000,328 (44.08%) bytes.
Если вы используете getApplicationContext()
повсюду, то наверняка вы пропустите память! Это вообще плохая идея. Вы должны использовать надлежащий контекст в нужном месте.
Возьмите кучу кучи, используйте профилировщик (например, MAT или jhat) и посмотрите на экземпляры, которые не должны быть там (действия, которые должны были быть уничтожены). Следуйте цепочке ссылок назад и выясните, почему они не возвращаются.