Привет! Если вы пишете бэкенд на Java или Go, то наверняка знаете, какой роскошью мы обладаем по сравнению с коллегами, пишущими на C++ или Rust. Нам не нужно вручную выделять память под каждый объект и судорожно следить за тем, чтобы вовремя её очистить. За нас всю грязную работу делает невидимый слуга — Garbage Collector (GC), или сборщик мусора.
Казалось бы, живи и радуйся. Но у этой медали есть пугающая обратная сторона, имя которой — Stop-the-World (STW) паузы. Это те самые страшные моменты, когда сборщик мусора полностью замораживает работу всего вашего приложения, чтобы навести порядок в оперативной памяти. В этот миг пользователи ждут ответа от сервера, транзакции зависают, а графики мониторинга тревожно ползут вверх.
Разработчики Java и Go годами шли совершенно разными путями, чтобы победить эти задержки. И сегодня они пришли к поразительным результатам. Давайте без занудства, формул и кода разберем «под капотом», чья философия уборки мусора оказалась круче и эффективнее под реальным Highload.
Как они вообще понимают, что объект — это мусор? (Трехцветная маркировка)
Несмотря на все различия, базовый алгоритм поиска ненужных объектов у Java и Go одинаковый. Называется он поэтично — трехцветная маркировка.
Представьте, что сборщик мусора — это дотошный ревизор с тремя маркерами: белым, серым и черным.
- В самом начале уборки все объекты в памяти помечаются белым цветом. Это потенциальный мусор.
- Затем ревизор берет объекты, к которым приложение обращается напрямую прямо сейчас (корневые точки), и красит их в серый цвет. Это значит: «Я их нашел, но еще не проверил, на что они ссылаются».
- Робот начинает идти по цепочкам ссылок от серых объектов к следующим. Как только объект и все его «зависимости» проверены, он красится в черный цвет(живые данные). Те, до кого дойти так и не удалось, остаются белыми. Их-то в конце и стирают из памяти.
Главный вызов для инженеров состоял в том, как делать эту покраску прямо во время работы приложения, чтобы не останавливать мир. И вот тут дорожки Java и Go радикально разошлись.
Философия Go: Низкая задержка ценой всего остального
Создатели Go изначально проектировали язык для высококонкурентных сетевых сервисов. Для них микросекундные задержки при обработке запросов были критически важны. Поэтому они создали ультракороткий, хирургически точный сборщик мусора.
Сборщик мусора в Go работает параллельно с вашим кодом. Чтобы во время уборки приложение случайно не изменило связи между объектами (например, не прикрепило белый объект к черному в обход серого), в Go используются специальные «барьеры записи». Это легкие невидимые проверки, которые на лету корректируют цвета объектов прямо во время выполнения программы.
Благодаря этому Go добился феноменальных результатов: паузы Stop-the-World там практически незаметны и длятся сущие микросекунды.
Но за всё приходится платить. Сборщик Go — простой. Он не умеет перемещать объекты в памяти, чтобы утрамбовать её (компактизировать). Со временем память приложения становится похожа на сыр с дырами (фрагментируется). Из-за этого Go тратит больше процессорного времени и ресурсов на саму уборку, жертвуя общей пропускной способностью системы ради того, чтобы сервер ни на долю секунды не заикнулся.
Философия Java: Умный хардкор и революция ZGC
В мире Java исторически всё было иначе. Исторически Java-приложения — это огромные корпоративные монстры с гигантскими объемами памяти (хипа) на сотни гигабайт или даже терабайты. Долгое время стандартные сборщики Java работали по «поколенческому» принципу: делили объекты на молодые и старые, копировали их с места на место, чтобы избежать той самой фрагментации, и... периодически намертво вешали сервер на несколько секунд, когда хип разрастался.
Но несколько лет назад в Java произошла тихая революция — появился сборщик ZGC (Z Garbage Collector). И это шедевр инженерной мысли.
Разработчики ZGC применили хитрый трюк под названием «цветные указатели» и «барьеры загрузки». Они зашили информацию о состоянии объекта прямо в адреса оперативной памяти. Теперь, когда приложение Java пытается прочитать объект, виртуальная машина на лету проверяет его «цвет». Если объект еще не обработан сборщиком мусора, программа сама помогает его покрасить и передвинуть в нужное место, не дожидаясь глобальной остановки.
Результат шокировал ИТ-сообщество: ZGC умеет убирать терабайты мусора, трамбовать память, чистить легаси-объекты, и при этом паузы Stop-the-world не превышают одной миллисекунды. Ей абсолютно всё равно, сколько памяти у вашего сервера — 10 гигабайт или 16 терабайт, уборка произойдет незаметно.
Кто в итоге победил?
Победила, как всегда, инженерная целесообразность.
- Go идеален для небольших, быстрых микросервисов, утилитарных утилит и сетевых прослоек, где важна мгновенная реакция «здесь и сейчас», а объемы оперативной памяти предсказуемы и невелики. Его сборщик мусора прост, не требует тонкой настройки и отлично работает из коробки.
- Java со своим ZGC остается королем тяжелого корпоративного Highload. Если у вас огромная монолитная система, терабайты кэша в памяти, сложные аналитические вычисления и миллионы долгоживущих объектов — современная Java переварит это и даже не поморщится, обеспечивая колоссальную пропускную способность без риска завалить сервер в многосекундный ступор.
Индустрия пришла к тому, что плохих инструментов не осталось. Главное — понимать, как ваш невидимый «уборщик» устроен под капотом, чтобы не требовать от легкого городского самоката грузоподъемности магистральной фуры.
А на каком стеке пишете вы? Приходилось ли вам в продакшене тюнить параметры сборщика мусора в Java или бороться с потреблением памяти в Go?
❤️ Поддержите автора Донатом — это лучший способ сказать спасибо всей команде IT Extra. Ваша поддержка очень вдохновляет нас на создание интересного и качественного контента!
👍 Ставьте лайки если хотите разбор других интересных тем.
👉 Подписывайся на IT Extra на Дзен чтобы не пропустить следующие статьи
Если вам интересно копать глубже, разбирать реальные кейсы и получать знания, которых нет в открытом доступе — вам в IT Extra Premium. Это — ваш личный доступ к экспертизе, упакованной в понятный формат. Не просто теория, а инструменты для роста.
👉 Переходите на Premium и начните читать то, о чем другие только догадываются.