← Назад к вопросам

Что такое ZGC?

3.0 Senior🔥 141 комментариев
#JVM и управление памятью

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

ZGC — масштабируемый сборщик мусора для Java

ZGC (Z Garbage Collector) — это **низколатентный сборщик мусора**, разработанный компанией Oracle для обработки больших объёмов памяти (от МБ до ТБ) с минимальными паузами приложения. Он был представлен в Java 11 и продолжает развиваться.

Основные характеристики ZGC

Низкие паузы: ZGC стремится к паузам не более 10 миллисекунд, независимо от размера кучи.

Масштабируемость: Эффективно работает с очень большими объёмами памяти (от гигабайт до терабайт).

Параллельная работа: Большинство операций сборки мусора выполняются параллельно с приложением.

Многопоточность: Использует несколько потоков для сборки мусора.

Проблема с традиционными сборщиками мусора

Традиционные сборщики мусора (G1GC, CMS) вызывают заметные паузы приложения:

// Приложение остаётся заблокировано во время GC
public class GCPauseProblem {
    public static void main(String[] args) {
        List<byte[]> memory = new ArrayList<>();
        
        for (int i = 0; i < 100000; i++) {
            memory.add(new byte[10240]); // Выделение памяти
        }
        
        // Когда памяти не хватает, сборщик мусора вызывает PAUSE
        // Приложение замерзает на несколько сотен миллисекунд
    }
}

Для высоконагруженных систем (финтех, игровые серверы) такие паузы неприемлемы.

Как работает ZGC

ZGC использует цветные указатели (colored pointers) и барьеры записи для отслеживания объектов без полной паузы приложения:

// Запуск приложения с ZGC
// java -XX:+UseZGC -Xmx16G MyApp

public class HighLatencySensitiveApp {
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        
        // Выделение больших объёмов памяти
        for (int i = 0; i < 1000000; i++) {
            String text = "Large string data " + i;
            // ZGC будет выполнять сборку мусора с минимальными паузами
        }
        
        long duration = System.currentTimeMillis() - startTime;
        System.out.println("Application latency: " + duration + "ms");
    }
}

Этапы работы ZGC

Mark — маркировка живых объектов параллельно с приложением.

Relocation — перемещение объектов в памяти для дефрагментации.

Remap — обновление ссылок на перемещённые объекты.

Каждый этап содержит очень короткие паузы (обычно < 1ms).

Цветные указатели (Colored Pointers)

Это инновационная техника, которая хранит информацию о состоянии объекта в самом указателе:

// Указатель содержит не только адрес, но и флаги состояния:
// 64-бит указатель:
// [marked0 | marked1 | remapped | finalizable | ... | address (42 bits) ]
//   1 bit   1 bit    1 bit     1 bit       ...        42 bits

Это позволяет ZGC отслеживать состояние объектов без дополнительных структур данных.

Сравнение с другими сборщиками мусора

GCТип паузыРазмер кучиПрименение
G1GCСредние паузы (100-500ms)До 1TBУниверсальный
CMSДлинные паузы (в фоне)До 128GBСтарые приложения
ZGCОчень короткие паузы (<10ms)До 16TB+Низколатентные системы
ShenandoahОчень короткие паузыДо 8TBRedHat/OpenJDK

Когда использовать ZGC

  • Финансовые системы: Требуют минимального latency
  • Высоконагруженные веб-сервисы: с большим количеством соединений
  • Системы реального времени: где паузы критичны
  • Большие объёмы данных: кэши, базы данных в памяти
  • Игровые серверы: чувствительны к задержкам

Пример включения ZGC

# Java 11+
java -XX:+UseZGC -Xms4G -Xmx16G -XX:+UnlockExperimentalVMOptions \
     -XX:ZUncommitDelay=30 MyApplication

# Java 15+ (ZGC стабилен, уже не experimental)
java -XX:+UseZGC -Xms4G -Xmx16G MyApplication

Мониторинг ZGC

// Получение информации о сборке мусора
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();

System.out.println("Used: " + heapUsage.getUsed() / 1024 / 1024 + "MB");
System.out.println("Max: " + heapUsage.getMax() / 1024 / 1024 + "MB");

Недостатки ZGC

  • Потребление CPU: Требует большего количества процессорных ядер
  • Пропускная способность: Может быть меньше, чем G1GC для некритичных к latency приложений
  • Молодость: Меньше production примеров, чем для G1GC

Заключение

ZGC — это революционный сборщик мусора для современных высоконагруженных Java приложений, которые требуют предсказуемо низких pauses. Он особенно полезен в микросервисной архитектуре и облачных средах.