memória, percorrendo incansavelmente o reino da memória alocada, liberando os fragmentos esquecidos e poupando os desenvolvedores da necessidade da desalocação manual de memória. Garbage Collector O que é o Garbage Collector?
Initial Mark Phase ◦ Essa é a primeira fase, na qual o coletor identifica os objetos “vivos” e os marca como objetos ativos, isso é crucial para ser utilizado nas outras etapas. ◦ Essa fase é STW(Stop the world) • Concurrent Marking Phase ◦ Determina todos os objetos atualmente alcançáveis (vivos) nas regiões da old generation a serem mantidos para a seguinte fase, remark phase. • Remark Phase ◦ Nessa fase é realizado a identificação quaisquer alterações nos objetos “vivos” que ocorreram na fase anterior. Isso é essencial para a eficácia do G1GC, para isso é feito com STW. ◦ Usa o algoritmo Snapshot-at-the-Beginning (SATB), que é muito mais rápido do que o usado com o CMS. • Copying/Cleanup Phase ◦ Atualiza a informação de objetos vivos e regiões totalmente livres, isso é crucial para próximas coletas. (STW) ◦ Limpa as regiões, libera o espaço. (Concurrent)
permanent Generation é destinada para metadados que representam as classes, métodos… • Desde o Java 8, o nome PermGen foi substituido por Metaspace; -XX:+MaxMetaspaceSize=100m • Os metadados de classe são desalocados quando a classe Java correspondente é descarregada. • Unload classes GC
utiliza uma única thread para executar o GC; • Recomendado para máquinas com 1 CPU; • Recomendado para máquinas com até 100MB; -XX:+UseSerialGC • Recomendado para aplicações client-class machine;
utiliza uma multi thread para executar o GC; • Recomendado para aplicações com médio e grande tamanho; • Default GC para versões < 9; -XX:+UseParallelGC • Recomendado para aplicações que tem foco em throughput;
GC utiliza também multi thread para executar o GC; • Default GC para versões >= 9 JEP 248; • Limitar os pause times do GC é, em geral, mais importante do que maximizar o Throughput; • Evita execução do Full GC também é uma das principais melhorias em comparação ao Parallel GC JEP 156; • Recomendado para aplicações que buscam balancear a latência e o throughput;
G1 é um server-style GC adequado para máquinas com vários processadores com grandes memórias; -XX:+UseG1GC • Prove um equilibrio entre throughput e latency. • Busca minimizar as chances de memory fragmentation. Para isso ele realiza um processo de compactação, além de possuir um espaço para objetos enormes.
-XX:+UseEpsilonGC -XX:+UnlockExperimentalVMOptions • Não tem latência, pq não há execução do GC, em compensação a um consumo constante de memoria; • GC lida com a alocação de memória, mas não implementa nenhum mecanismo para limpar a memoria; • Utilização para benchmark, lambdas, aplicações de curta duração. • Introduzido no Java 11 como Experimental, JEP 318;
diminuir a latência, com menores pause times, garantindo um pause time similiar independente do tamanho da Heap. Entretanto, isso afeta o throughput; -XX:+UseShenandoahGC • Disponível para versões >= 15 JEP 379; • Ideal para aplicações que buscam um pequeno pause time de forma consistente, seja para 200MB ou 200GB.
GC projetado para baixa latência e alta escalabilidade. • Disponível para versões >= 15 JEP 377; • Um dos objetivos do ZGC é ter pause times menores que 1ms. -XX:+UseZGC • Suportar aplicações pequenas (MBs) até aplicações muito grandes (TBs). • Não separa a heap em old e young generation;
aplicação for client-side, utilize o SerialGC • Se sua aplicação for server-side, utilize o default G1GC e verifique as necessidades. • Se o foco for em throughput, não tiver problemas com latência, utilize o parallelGC. • Se quiser um equilíbrio entre throughput e latência, utilize o G1GC. • Se o seu foco for em minimizar latência, e estiver com Java >= 17, pode tentar o ZGC.
-XX:G1HeapWastePercent=5 - G1 interrompe a fase de recuperação de espaço se o espaço livre para coleta for menor do essa definição • Evite definir explicitamente o tamanho da young generation com o -Xmn ou -XX:NewRatio • Se você quiser definir o tamanho da young generation use -XX:G1MaxNewSizePercent=60 or -XX:G1NewSizePercent=5