Я витратив 4 повних дні, намагаючись зробити все можливе, щоб з’ясувати витік пам’яті в програмі, яку розробляю, але речі давно перестали мати сенс.
Додаток, який я розробляю, має соціальний характер, тому подумайте про профіль Діяльність (P) та перелічіть Діяльність із даними - наприклад, значки (В). Ви можете перейти від профілю до списку значків до інших профілів, до інших списків тощо.
Тож уявіть собі такий потік, як P1 -> B1 -> P2 -> B2 -> P3 -> B3 і т. Д. Для послідовності я завантажую профілі та значки одного і того ж користувача, отже кожна сторінка P однакова і така ж кожна сторінка B.
Загальна суть проблеми полягає в тому, що, провівши трохи навігації, залежно від розміру кожної сторінки, я отримую виняток, який не вистачає пам’яті в випадкових місцях - растрові карти, рядки тощо - це, здається, не узгоджується.
Зробивши все, що можна собі уявити, щоб зрозуміти, чому у мене закінчується пам’ять, я нічого не придумав. Я не розумію, чому Android не вбиває P1, B1 тощо, якщо при завантаженні у нього закінчується пам’ять, а замість цього відбувається збій. Я би очікував, що ці попередні дії помруть і воскреснуть, якщо коли-небудь повернусь до них через onCreate () та onRestoreInstanceState ().
Не кажучи вже про це - навіть якщо я роблю P1 -> B1 -> Назад -> B1 -> Назад -> B1, я все одно отримую збій. Це вказує на якийсь витік пам'яті, але навіть після скидання hprof та використання MAT та JProfiler я не можу його точно визначити.
Я вимкнув завантаження зображень з Інтернету (і збільшив завантажені тестові дані, щоб це компенсувати та зробити тест справедливим) і переконався, що кеш зображень використовує SoftReferences. Android насправді намагається звільнити кілька програм SoftReferences, які він має, але безпосередньо перед тим, як виходить із пам'яті.
Сторінки бейджів отримують дані з Інтернету, завантажують їх у масив EntityData з BaseAdapter і подають до ListView (я насправді використовую чудовий MergesAdapter від CommonsWare , але в цій діяльності з бейджами в будь-якому випадку є лише 1 адаптер, але я хотів би згадати цей факт у будь-якому випадку).
Я пройшов код і не зміг знайти нічого, що могло б просочитися. Я очистив і обнулив все, що міг знайти, і навіть System.gc () ліворуч і праворуч, але програма все одно аварійно завершує роботу.
Я все ще не розумію, чому неактивні дії, які є в стеку, не отримують, і я б дуже хотів це зрозуміти.
На даний момент я шукаю будь-які підказки, поради, рішення ... все, що може допомогти.
Дякую.
outOfMemory
помилку. Дякую!