На этой неделе занимались с командой избыточным потреблением памяти bitmap'ами.
После профилирования Heap Dump обнаружили, что значительная часть изображений декодируется и хранится в памяти в размерах, которые заметно превышают реальные размеры View. В результате память расходовалась на данные, которые пользователь физически не мог увидеть на экране.
Что сделали:
• пересмотрели логику выбора размеров изображений при загрузке;
• добавили допуск при подборе размера ресурса, чтобы избежать загрузки более тяжелых вариантов без реального выигрыша в качестве;
• для ряда кейсов начали явно ограничивать размер bitmap'ов в памяти через override;
• изменили fallback-логику: если размер View неизвестен, больше не загружаем максимально крупный вариант изображения;
• оптимизировали декодирование некоторых часто используемых обложек и баннеров.
Результат после полного прохода по основным экранам приложения:
📉 Потребление памяти на отдельных экранах уменьшилось на -34,6%
📉 Размер отдельных bitmap'ов получилось значительно уменьшить: 7 МБ → 0,8 МБ (-89%)
Что нравится в таких задачах — эффект достигается не за счет агрессивной очистки памяти или ухудшения качества изображений, а за счет более корректной работы с ресурсами.
Для понимания масштаба проблемы:
Bitmap 1000×1000 в ARGB_8888 ≈ 4 МБ памяти.
Bitmap 600×600 ≈ 1.4 МБ.
Bitmap 300×300 ≈ 0.34 МБ.
Разница между xlarge и small может составлять более 10 раз по памяти на одном изображении.
Во многих проектах Glide/Coil уже используются, но это не гарантирует эффективного потребления памяти. Если приложение активно работает с изображениями, рекомендую периодически проверять:
— какие Bitmap занимают память;
— какого они размера;
— соответствуют ли размеры bitmap реальному размеру View;
— правильно ли работает ваша стратегия image loading.
Полезные материалы по теме:
🔹 Android Developers — Loading Large Bitmaps Efficiently
https://developer.android.com/topic/performance/graphics/load-bitmap
🔹 Android Developers — Managing Bitmap Memory
https://developer.android.com/topic/performance/graphics/manage-memory
🔹 Android Developers — Optimizing Bitmap Images
https://developer.android.com/develop/ui/compose/graphics/images/optimization