ZGC (Low Latency)
O Z Garbage Collector, é um coletor de lixo escalável de baixa latência projetado para atender aos seguintes objetivos:
- Tempos máximos de pausa de sub-milissegundos (Para JDK <16 o max GC pause-time é na casa de 10ms, no JDK ≥16 fica abaixo de 1ms)
- Os tempos de pausa não aumentam com o tamanho de heap, live-set ou root-set (Isso para o JDK ≥=16)
- Lidar com heaps que variam de 8 MB a 16 TB de tamanho
- Redução máxima de throughput de 15%
O ZGC trabalha totalmente diferente das implementações anteriores, ele é um coletor que trabalha com apenas ‘uma geração (generation)’, ou seja, não possui a divisão de Young e Old Generation. De forma similar ao G1 GC ele possui o conceito de ‘regiões’, denominadas de ZPages,não com divisões por tipo, mas sim por tamanho: Small (2M), Medium (32MB) e Large (N*2MB)

O ZGC trabalha de forma concorrente, ou seja, sua execução é feita junto com as threads do sistema, isso faz com que a coleta de lixo tenha baixo impacto no response time da aplicação (baixa latência).

Diversas funcionalidades faz o ZGC ser um incrível coletor, uma delas é a possibilidade de gerenciar dinamicamente suas threads (funcionalidade incluida no Java 17). O ZGC também é capaz de devolver memória não utilizada ao sistema operacional, muito útil em sistemas que o consumo de memória da máquina é algo preocupante, importante salientar que a memória nunca será diminuída abaixo do tamanho mínimo do heap configurado (-Xms<size>).
Definir um tamanho máximo de heap é muito importante ao usar o ZGC (-Xmx<size>), porque o comportamento do coletor depende da variação da taxa de alocação e de quanto do conjunto de dados está ativo. O ZGC funciona melhor com um heap maior, mas desperdiçar memória desnecessária também é ineficiente, portanto, você precisa ajustar o equilíbrio entre o uso de memória e os recursos disponíveis para coleta de lixo.
O ZGC ainda não é um coletor default, ele foi disponibilizado no Java 11 como experimental e liberado para produção a partir do Java 15, ele é a melhor escolha se sua aplicação for focada em baixa latência, para habilitá-lo, basta utilizar o seguinte argumento: -XX:+UseZGC
, para versões anteriores ao Java 15 precisamos adicionar o seguinte argumento: -XX+UnlockExperimentalVMOptions
Conclusão
Para muitos, o conhecimento da JVM e as implementações de Garbage Collector não são fundamentais, muitos pesquisam apenas para ‘tuning’ ou não sabem que existem diferentes implementações, porém, vimos que conhecê-las é fundamental, nenhuma implementação é melhor que a outra, cada uma é para um determinado problema, e conhecê-las nos ajudará a entregar cada vez mais software com qualidade.
Nesse artigo, introduzimos seus principais tipos e características, mas, há muito a se falar sobre Garbage Collector, em um proxímo artigo, tentarei abordar assuntos como monitoramento e logs, e quem sabe até mesmo sobre tuning. Espero que tenham gostado, até o proxímo 👋
Referências
- HotSpot Virtual Machine Garbage Collection Tuning Guide — Oracle / Java 17
- Hands-On High Performance with Spring 5 — Packt
- Java Garbage Collection handbook
- Getting Started with the G1 Garbage Collector
- OpenJDK Wiki — ZGC
- ZGC: The Next Generation Low-Latency Garbage Collector (Video e Slides)
- Getting started with Z Garbage Collector (ZGC) in Java 11
- Concurrent thread-stack processing in the Z Garbage Collector
Veja as outras parte deste artigo: