🗑️

Garbage Collection в языке Go

Jul 15, 2024

Лекция на тему Garbage Collection в языке Go

Введение

  • Презентация от Нины Пакшиной на встрече клуба программистов.
  • Статья на Хабре о сборщике мусора в Go.
  • Тема: управление памятью и использование сборщика мусора (Garbage Collector, GC) в Go.

Основные понятия

Области памяти в Go

  • Стек (Stack):
    • Управляется рантаймом Go, работает по принципу LIFO (Last In, First Out).
    • Используется для локальных переменных, аргументов функций и возвращаемых значений.
  • Куча (Heap):
    • Область памяти для хранения динамических данных.
    • Требует управления с помощью сборщика мусора, иначе программа может использовать все доступные ресурсы.

Escape Analysis

  • Инструмент для анализа кода, чтобы понять, какие данные попадут в стек, а какие в кучу.
  • Пример выполнения программы с использованием флага -m для анализа распределения памяти.

Сборщик мусора в Go

Основные алгоритмы

  • Mark and Sweep:
    • Маркировка (Marking): Проход по дереву объектов для пометки живых объектов.
    • Очистка (Sweeping): Удаление неиспользуемых объектов из кучи.
  • Трехцветный алгоритм маркировки (пометка данных серыми, черными и белыми).
  • Важно понимать баланс между ресурсами памяти и процессорным временем.

Stop the World

  • Полное прекращение выполнения программы во время работы сборщика мусора.
  • В современных реализациях Go остановка происходит только на этапах подготовки и завершения маркировки.

Управление сборщиком мусора

Переменные окружения и флаги

  • GOGC: Переменная для управления частотой запуска сборщика мусора.
    • Значения в процентах (например, 100%, 1000%, 10% и т.д.).

Пример использования

  • Пример запуска программы при различных значениях GOGC и анализ выгоды.
  • Влияние GOGC на потребление памяти и процессорное время.

gOMEMLIMIT

  • Переменная окружения для ограничения памяти, используемой программой.
  • Обеспечение того, что программа не превысит установленный лимит памяти.
  • Возможность управления памятью с помощью функций пакета runtime/debug.
  • Пример использования gOMEMLIMIT для уменьшения вероятности ошибки Out-Of-Memory (OOM).

Ограничения и особенности

  • Режим «Спираль смерти» (Spiral of Death): чрезмерное использование процессорного времени для сборки мусора.
  • Мягкое управление памятью: ограничение использования процессорного времени до 50%.

Оптимизация использования памяти

sync.Pool

  • Пул объектов для повторного использования временных объектов.
  • Пример использования sync.Pool для экономии времени на аллокацию памяти.
  • Особенности:
    • Повторное использование объектов определенного типа.
    • Потокобезопасность.

Arena

  • Экспериментальный инструмент начиная с версии Go 1.20.
  • Создание сегментов памяти с ручным управлением.
  • Использование для крупных объектов.
  • Преимущества и ограничения:
    • Объекты разного типа, ручное освобождение памяти через Free.
    • Не потокобезопасный (в рамках одной рутины).
    • Использование в Google для экономии процессорного времени до 15% на больших данных.

Заключение

  • Оптимизация программы по времени исполнения и потреблению памяти — важный процесс.
  • Инструменты для управления сборщиком мусора (GOGC, gOMEMLIMIT) и другие техники (sync.Pool, Arena).
  • Важно иметь базовое понимание работы GC для оптимизации кода и избежания ошибок OOM.