В приложении Android не хватает памяти - перепробовал все, но все равно не смог

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

Приложение, которое я разрабатываю, носит социальный характер, поэтому подумайте о профиле «Действия» (P) и укажите «Действия» с данными - например, значки (B). Вы можете переходить от профиля к списку значков, к другим профилям, к другим спискам и т. Д.

Итак, представьте себе такой поток P1 -> B1 -> P2 -> B2 -> P3 -> B3 и т. Д. Для единообразия, Я загружаю профили и значки одного и того же пользователя, поэтому каждая страница P одинакова, как и каждая страница B.

Общая суть проблемы такова: после некоторой навигации, в зависимости от размера каждой страницы, я получаю исключение нехватки памяти в случайных местах - растровых изображениях, строках и т. Д. - похоже, это не так. быть последовательным.

Сделав все возможное, чтобы выяснить, почему у меня заканчивается память, я ничего не придумал. Я не понимаю, почему Android не убивает P1, B1 и т. Д., Если у него заканчивается память при загрузке и вместо этого происходит сбой. Я ожидал, что эти предыдущие действия умрут и воскреснут, если я когда-нибудь вернусь к ним через onCreate () и onRestoreInstanceState ().

Не говоря уже об этом - даже если я сделаю P1 -> B1 -> Back -> B1 -> Back -> B1, я все равно получу вылет.Это указывает на некоторую утечку памяти, но даже после сброса hprof и использования MAT и JProfiler я не могу ее точно определить.

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

Страницы значков получают данные из Интернета, загружают их в массив EntityData из BaseAdapter и передают их в ListView (на самом деле я использую отличный MergeAdapter CommonsWare , но в этом действии Badge там в любом случае действительно только 1 адаптер, но я хотел бы упомянуть этот факт в любом случае).

Я просмотрел код и не смог найти ничего, что могло бы протечь. Я очистил и аннулировал все, что смог найти, и даже System.gc () слева и справа, но приложение все равно вылетает.

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

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

Спасибо.

87
задан Artem Russakovskii 24 September 2011 в 05:15
поделиться