Производительность
GC: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Каждый отражает решение, которое ты принимаешь в реальном инциденте — не определение для заучивания, а компромисс, который надо взвесить под нагрузкой.
Убедись, что связываешь давление аллокаций, выбор коллектора, ручки тюнинга и production-сбои — тот синтез, к которому вели отдельные уроки.
Сервис A держит кэш 4 ГБ и аллоцирует 50 МБ/с. Сервис B держит 100 МБ живых данных и аллоцирует 1 ГБ/с. Коллектор одинаковый. У кого больше GC-хвостовая задержка и почему?
Go-сервис в контейнере 4 ГБ спорадически убивается по OOM на пиках трафика; GOGC по умолчанию 100. Какая первая ручка и что она реально делает?
После миграции с G1 на (негенерационный) ZGC паузы упали с 60 мс до <1 мс, но пропускная способность снизилась ~12%, а RSS вырос ~18%. Как это читать?
Зачем конкурентному коллектору барьер записи и что ломается без него?
Java-сервис регистрирует Object.finalize() на обёртках файловых дескрипторов; под нагрузкой число открытых дескрипторов непредсказуемо скачет. Корневая причина?
gctrace показывает рост GC CPU 1% → 39% за час, при этом время конкурентной маркировки растёт с 1.3 мс до ~350 мс. Что происходит и какой первый фикс?
Сквозная линия юнита — одно дерево решений: allocation rate задаёт частоту GC, живой набор задаёт стоимость цикла, коллектор задаёт форму паузы, а ручки (сначала GOMEMLIMIT, потом GOGC/цель по паузе, в последнюю очередь алгоритм) защищают границы. Все production-сбои — OOM на пиках, компромиссы ZGC, штормы финализаторов, death-spiral, allocation-DoS — сводятся к одному рычагу: сократи аллокации, прежде чем что-либо тюнить.