Java Garbage Collector – Implementações, G1 GC (Garbage First) (Parte 3)

G1 GC

O objetivo do G1 GC é minimizar o tempo de pausa do GC e garantir o máximo de rendimento possível sem configuração adicional. Seu modelo fornece uma solução para usuários que executam aplicativos que exigem grandes heaps (não exigido) com uma latência de execução do GC limitada, ou seja, tempo de pausa (Ou as conhecidas STW) estável, configurável e previsível.

O G1 GC possui um conceito diferente de gerenciamento de memória no qual a heap é dividida em regiões de determinados tamanhos que variam de 1MB a 32MB. Por default o tamanho de cada região é baseado no tamanho máximo do heap que é calculado para renderizar aproximadamente 2048 regiões.

Representação da alocação de memória na heap usando o G1 GC | Fonte: Oracle

Sua estrutura permite que o GC evite coletar todo o heap de uma vez só.

A G1 executa a fase de marcação global de forma concorrente para determinar o tempo de vida dos objetos em todo heap. Após a marcação, o G1 sabe quais regiões estão com mais lixo e as coleta primeiro (por isso o nome: Garbage First). Para melhor explicação das fases de coleta do G1 GC veja no tópico “The G1 Garbage Collector Step by Step” do artigo da Oracle linkado.

O G1 usa um modelo de previsão de pausa para atender a uma meta de tempo definida pelo usuário e seleciona o número de regiões a serem coletadas com base na meta de tempo de pausa especificada. Dessa forma o G1 bem configurado tende a evitar coletas completas (Full GC). Podemos configurar o tempo máximo de pausa do G1 GC com o seguinte argumento: -XX:MaxGCPauseMillis=200(200 é o valor default). Vale salientar que o tempo definido é atendido com uma alta probabilidade mas não é uma verdade absoluta.

Seu uso é bastante recomendado caso sua aplicação esteja tendo ciclos de Full GC muito frequentes ou com tempos muito altos. Muita variação na taxa de alocação de objetos ou ‘promoção’ também é recomendado. Entretanto se sua aplicação for throughput-bound ou estiver consumindo 100% da CPU e se as durações das pausas do GC não for um problema, o Parallel GC pode ser uma opção a ser testada.

O G1 GC foi definido como default a partir do Java 9 e ainda o permanece até o Java 17, porém no Java 15 foi liberado o ZGC para produção, no qual falaremos no próximo tópico. Para definir o G1 como coletor padrão em outras versões do Java (7 e 8), basta utilizarmos o seguinte argumento:
-XX:+UseG1GC


Veja as outras parte deste artigo:

No próximo post falaremos sobre o coletor ZGC =)

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

Java Garbage Collector – Implementações, G1 GC (Garbage First) (Parte 3)

Um pensamento em “Java Garbage Collector – Implementações, G1 GC (Garbage First) (Parte 3)

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