> Что происходит в программе при отсутствии доступной памяти (Go)
Уровень: middle · Роль: backend · Категория: Технические вопросы
Компании: Avito
Стек: Go
> Пример ответа
В Go при исчерпании доступной памяти (OOM - Out Of Memory) поведение зависит от того, на каком этапе это происходит:
-
На уровне приложения (куча Go): рантайм Go пытается расширить кучу, запрашивая память у ОС через
mmap. Если ОС отказывает (например, из-за лимитов cgroup или физической нехватки), рантайм вызываетruntime.throw("out of memory")- это фатальная паника, которую нельзя перехватить черезrecover. Программа аварийно завершается с дампом стека. -
На уровне ОС (OOM Killer): если Go-программа уже выделила память (например, через
mmap), но физическая память исчерпана, ядро Linux может запустить OOM Killer. Он завершит процесс с наибольшим «badness score». Go-приложение убьётся сигналом SIGKILL, без возможности обработки. -
Особенности Go: сборщик мусора (GC) может не успеть освободить память при резком росте нагрузки. В Go 1.19+ добавлен
GOMEMLIMIT- мягкий лимит памяти, который помогает избежать OOM, замедляя аллокации и форсируя GC.
Рекомендации: используйте runtime/debug.SetMemoryLimit для контроля, мониторьте метрики через runtime.ReadMemStats и настраивайте лимиты контейнера (cgroup).
> Похожие задачи по backend
Какова асимптотическая сложность доступа по ключу в хэш-таблице
В чем различия между стеком и хипом в Go
Как реализовать паттерн fan-out fan-in в Go с использованием горутин?
Что такое селективность индекса и почему не всегда индекс используется?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью