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