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