Java Garbage Collector – Implementações, ZGC (Parte 4 / Final) – Help DEV
Sem comentários em Java Garbage Collector – Implementações, ZGC (Parte 4 / Final)Postado em Java Por Guilherme Biff ZarelliPostado em 28 de janeiro de 2022 28 de janeiro de 2022 Marcado garbage collector, gc, java, zgc
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
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 👋