← Назад к вопросам

Можешь рассказать о своем провале

1.0 Junior🔥 211 комментариев
#Опыт и софт-скиллы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

О провале и как я его преодолел

Я хочу рассказать о времени, когда я совершил серьёзную ошибку в управлении памятью, которая привела к критическому багу в production.

Ситуация

Я работал над большим приложением для развлекательного контента. Мы использовали Retrofit для загрузки видео и кэшировали результаты в памяти используя обычные HashMap.

Код выглядел так:

companion object {

    private val videoCache = HashMap<String, ByteArray>()
}

Проблема

После каждой загрузки видео (50-100 MB) оно оставалось в памяти в HashMap. Пользователи жаловались:

  • Приложение становится медленнее
  • Появляется OutOfMemoryError
  • На некоторых телефонах падает вообще

Я не предусмотрел, что HashMap будет расти бесконечно, а garbage collector не может удалить объекты из-за strong references.

Первые попытки

  1. Я просто добавил проверку размера и очищал cache вручную
  2. Но это было хаотично и нестабильно

Решение

Я переделал систему кэширования на WeakHashMap:

private val videoCache = WeakHashMap<String, ByteArray>()

Теперь garbage collector мог удалять видео из памяти когда нужна была место.

Но это не всё

После анализа я понял еще несколько ошибок:

  1. Не использовал LRU cache
  2. Не контролировал размер одного объекта
  3. Не обрабатывал исключения при недостатке памяти

Финальное решение

Я использовал LruCache из Android Jetpack:

private val cacheSize = maxMemory / 8
private val cache = LruCache<String, ByteArray>(cacheSize.toInt()) {
    it.size
}

Это дало:

  • Ограниченный размер памяти
  • Автоматическое удаление старых элементов
  • Контроль над использованием памяти

Что я изучил

  1. Memory management в Android критичен
  2. Strong references могут привести к утечкам
  3. Всегда нужна стратегия кэширования
  4. Тестирование на разных устройствах важно
  5. Профилирование памяти с Android Studio

Как я избежал этого в следующий раз

  • Использовал правильные типы ссылок
  • Профилировал приложение перед deployment
  • Читал документацию Android
  • Делал code review с опытными разработчиками

Этот опыт заставил меня стать осторожнее с памятью и лучше понимать garbage collection.

Можешь рассказать о своем провале | PrepBro