Java Garbage Collector – Implementações, ZGC (Parte 4 / Final)

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)

Representação das regiões da heap gerenciadas pelo ZGC | Fonte: Packt

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).

Representação das fases do ZGC | Fonte: OpenJDK

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


Veja as outras parte deste artigo:

Help DEV – Analista desenvolvedor Java / Android https://helpdev.com.br/zarelli

Java Garbage Collector – Implementações, ZGC (Parte 4 / Final)

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Rolar para o topo