> Что происходит в программе при отсутствии доступной памяти (Go)

Уровень: middle · Роль: backend · Категория: Технические вопросы

Компании: Avito

Стек: Go

> Пример ответа

В Go при исчерпании доступной памяти (OOM - Out Of Memory) поведение зависит от того, на каком этапе это происходит:

  1. На уровне приложения (куча Go): рантайм Go пытается расширить кучу, запрашивая память у ОС через mmap. Если ОС отказывает (например, из-за лимитов cgroup или физической нехватки), рантайм вызывает runtime.throw("out of memory") - это фатальная паника, которую нельзя перехватить через recover. Программа аварийно завершается с дампом стека.

  2. На уровне ОС (OOM Killer): если Go-программа уже выделила память (например, через mmap), но физическая память исчерпана, ядро Linux может запустить OOM Killer. Он завершит процесс с наибольшим «badness score». Go-приложение убьётся сигналом SIGKILL, без возможности обработки.

  3. Особенности Go: сборщик мусора (GC) может не успеть освободить память при резком росте нагрузки. В Go 1.19+ добавлен GOMEMLIMIT - мягкий лимит памяти, который помогает избежать OOM, замедляя аллокации и форсируя GC.

Рекомендации: используйте runtime/debug.SetMemoryLimit для контроля, мониторьте метрики через runtime.ReadMemStats и настраивайте лимиты контейнера (cgroup).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью