Сравнение GC
Цель лабораторной
Сравнить поведение разных реализаций GC (Garbage Collector) под одинаковой нагрузкой и понять, как это влияет на:
- задержки приложения;
- потребление памяти;
- стабильность throughput;
- паузы (stop-the-world или частичные паузы).
Что нужно знать перед стартом
- Heap — область памяти для динамически создаваемых объектов.
- GC pause — время, когда выполнение пользовательского кода замедляется или останавливается ради уборки памяти.
- Allocation rate — скорость создания объектов.
- Promotion — перенос объектов из "молодого" поколения в "старшее".
- Compaction — уплотнение памяти для снижения фрагментации.
Важно: "быстрый GC" в одном сценарии может быть "плохим GC" в другом.
Подготовка эксперимента
1) Выберите сравниваемые платформы
Практичный минимум:
- Java (
G1,ZGCилиShenandoah), - Go (стандартный concurrent GC),
- .NET (Server GC / Workstation GC).
2) Сделайте одинаковую нагрузку
Сценарий должен быть идентичным:
- много короткоживущих объектов;
- часть долгоживущих объектов;
- постоянный поток запросов/операций.
3) Зафиксируйте условия
- одинаковый лимит RAM;
- одинаковое число CPU;
- одинаковая длительность теста (например, 10 минут);
- прогрев перед замером (1-2 минуты).
Пошаговая методика
Шаг 1. Снимите baseline без тюнинга
Для каждой платформы:
- Запустите приложение с настройками по умолчанию.
- Выполните нагрузку.
- Сохраните метрики и логи GC.
Шаг 2. Снимите ключевые метрики
Минимальный набор:
p50/p95/p99задержки;- throughput (операций/сек);
- среднее и пиковое потребление heap;
- количество и длительность GC-пауз;
- доля времени, потраченного на GC.
Шаг 3. Проведите controlled tuning
Меняйте только один параметр за раз. Примеры:
- размер heap,
- тип GC,
- целевая пауза (где поддерживается),
- пороги запуска сборки.
Шаг 4. Повторите прогоны
Каждый сценарий прогоняйте 3-5 раз. Сравнивайте медиану, а не единичный "удачный" запуск.
Что обычно показывает сравнение
- При высокой скорости аллокаций могут расти хвостовые задержки (
p99). - Уменьшение пауз иногда повышает расход CPU.
- Большой heap снижает частоту сборок, но может ухудшить latency в моменты тяжелой уборки.
- "Агрессивный" тюнинг GC без замера SLA часто ухудшает UX.
Шаблон таблицы результатов
Заполняйте для каждой конфигурации:
- Платформа и версия.
- Тип GC.
- Размер heap.
- Throughput.
p95/p99.- Суммарное время пауз.
- Пик RAM.
- Вывод (подходит/не подходит под SLA).
Типичные ошибки
- Сравнение разных по логике приложений вместо одинакового бенчмарка.
- Анализ только среднего времени ответа.
- Игнорирование прогрева JIT/рантайма.
- Отсутствие контроля версий и флагов запуска.
- Вывод "этот GC лучший всегда" без контекста нагрузки.
Практический итог
Результат лабораторной — не "выбрать модный GC", а получить доказуемый профиль:
- какой режим лучше для вашего SLA;
- где компромисс между latency, throughput и RAM;
- какие настройки безопасно применять в продакшене.
Только такие данные позволяют обсуждать производительность предметно, а не на уровне мифов.