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

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

Компании: Avito

Стек: Go

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

Если в Go-приложении не хватает памяти, происходит следующее:

  1. Out of Memory (OOM) Kill - операционная система (Linux) запускает OOM Killer, который завершает процесс с наибольшим потреблением памяти (обычно это ваше приложение). Это приводит к аварийному завершению программы без возможности корректно обработать ошибку.

  2. Паника runtime - если аллокация памяти происходит внутри Go-сборщика мусора (GC) или runtime, может возникнуть паника с сообщением runtime: out of memory. Это не перехватывается recover() в обычном коде, так как происходит на уровне рантайма.

  3. Симптомы до OOM:

    • Резкий рост времени GC (сборщик мусора пытается освободить память, но не успевает).
    • Увеличение задержек (latency) из-за частых циклов GC.
    • Появление ошибок cannot allocate memory в логах при попытке выделить память.

Как диагностировать и предотвратить:

  • Используйте pprof для профилирования памяти: go tool pprof -http=:8080 http://localhost:6060/debug/pprof/heap.
  • Установите лимиты памяти через GOMEMLIMIT (Go 1.19+) - это мягкий лимит, который помогает GC работать более предсказуемо.
  • Настройте GOMAXPROCS и GOGC для контроля частоты сборки мусора.
  • Используйте runtime/debug.SetMemoryLimit для программного ограничения.
  • В контейнерах (Docker/K8s) обязательно задавайте memory limits и memory requests.

Пример настройки лимита:

GO
import "runtime/debug"
func main() {
debug.SetMemoryLimit(512 * 1024 * 1024) // 512 MB
// ... остальной код
}

Если память закончилась, приложение упадёт. Единственный способ избежать - контролировать потребление и вовремя реагировать на предупреждения.

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

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