Я потратил 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 , но в этом действии значков есть в любом случае это всего лишь один адаптер, но я хотел бы упомянуть этот факт в любом случае).
Я просмотрел код и не смог найти ничего, что могло бы просочиться. Я очищал и обнулял все, что мог найти, и даже System.gc () влево и вправо, но приложение по-прежнему зависало.
Я до сих пор не понимаю, почему неактивные действия в стеке не получают, и я бы очень хотел это выяснить.
На данный момент я ищу любые подсказки, советы, решения ... все, что могло бы помочь.
Спасибо.