У меня есть приложение, которое потребляет много памяти - обрабатывает большие растровые изображения. Я настроил приложение, используя хорошо известные методы обработки таких растровых изображений (пожалуйста, не указывайте ссылки на руководства в ответах...), чтобы оно работало нормально без каких-либо OutOfMemoryError
исключений, но только на устройствах с HC и ICS, на Jelly Bean одно и то же приложение имеет почти на 80 % более высокое потребление памяти, что приводит к плохому взаимодействию с пользователем, приложение отстает и работает медленно.
Я подготовил простой тест, просто создал простейшее Android-приложение, используя шаблон в Eclipse; приложение имеет только одно действие с фоновым растровым изображением (1280 x 800). На устройстве с Android 3.1 (Asus A500) выделяется:
01-23 12:28:02.402: D/dalvikvm(31706): GC_FOR_ALLOC freed 65K, 4% free 6559K/6787K, paused 17ms
01-23 12:28:02.402: I/dalvikvm-heap(31706): Grow heap (frag case) to 10.355MB for 4096016-byte allocation
01-23 12:28:02.432: D/dalvikvm(31706): GC_CONCURRENT freed 1K, 3% free 10558K/10823K, paused 1ms+2ms
На Nexus 7 с JellyBean 4.2.1 выделяется:
01-23 12:13:49.740: D/dalvikvm(23815): GC_FOR_ALLOC freed 84K, 4% free 7464K/7700K, paused 18ms, total 18ms
01-23 12:13:49.750: I/dalvikvm-heap(23815): Grow heap (frag case) to 11.338MB for 4096016-byte allocation
01-23 12:13:49.770: D/dalvikvm(23815): GC_FOR_ALLOC freed 1K, 3% free 11463K/11704K, paused 23ms, total 23ms
01-23 12:13:49.800: D/dalvikvm(23815): GC_CONCURRENT freed <1K, 3% free 11463K/11704K, paused 2ms+2ms, total 23ms
01-23 12:13:49.900: D/dalvikvm(23815): GC_FOR_ALLOC freed <1K, 3% free 11463K/11704K, paused 12ms, total 13ms
01-23 12:13:49.920: I/dalvikvm-heap(23815): Grow heap (frag case) to 18.259MB for 7259056-byte allocation
01-23 12:13:49.940: D/dalvikvm(23815): GC_FOR_ALLOC freed 0K, 2% free 18552K/18796K, paused 16ms, total 16ms
01-23 12:13:49.960: D/dalvikvm(23815): GC_CONCURRENT freed <1K, 2% free 18552K/18796K, paused 3ms+2ms, total 17ms
Итак, у меня есть два вопроса:
1, почему приложение потребляет столько памяти при использовании только одного битмапа на фоне своей основной деятельности?
2, почему устройство с JellyBean потребляет почти на 80% больше памяти при запуске того же приложения?
EDIT1:
Все устройства имеют одинаковое разрешение экрана: 1280 x 800 px.
Bitmap
с целевым API, установленным на 15, два набора методов становятся светло-серыми, что может повлиять на использование памяти: isPremultiplied() и hasMipMap(). Может быть, один из них меняет значение по умолчанию с false на true в обновлении платформы? - person Barend   schedule 23.01.2013