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