Coconote
AI notes
AI voice & video notes
Try for free
🗑️
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.
📄
Full transcript