Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Garbage Collector - Java, não use o default

Thiago
August 22, 2023

Garbage Collector - Java, não use o default

Thiago

August 22, 2023
Tweet

More Decks by Thiago

Other Decks in Technology

Transcript

  1. Summary • O que é o Garbage Collector? • Como

    funciona o GC? • Existe mais de um GC? • JVM Ergonomics • Boas práticas
  2. Memory Leak são assassinos silenciosos, devorando lentamente os recursos do

    sistema, até que um dia toda a aplicação é condenada. Memory Leak O que é o Garbage Collector?
  3. Memory Leak são assassinos silenciosos, devorando lentamente os recursos do

    sistema, até que um dia toda a aplicação é condenada. Memory Leak O que é o Garbage Collector?
  4. O Garbage Collector é um guardião silencioso da gestão de

    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?
  5. Latency O que é o Garbage Collector? A latência é

    uma medida de quanto tempo uma única tarefa leva.
  6. Throughput O que é o Garbage Collector? A taxa de

    transferência é uma medida de quantas tarefas um aplicativo pode manipular simultaneamente durante um período de tempo.
  7. Old Generation G1 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)
  8. Permanent Generation/Metaspace O que é o Garbage Collector? • A

    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
  9. Serial GC Existe mais de um GC? • Serial 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;
  10. Parallel GC Existe mais de um GC? • Parallel GC

    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;
  11. Concurrent Mark Sweep GC (CMS) Existe mais de um GC?

    • Deprecated in Java 9 JEP 291 • Removed in Java 14 JEP 363 • Foi substituido pelo G1
  12. Garbage-First (G1) GC Existe mais de um GC? • G1

    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;
  13. Garbage-First (G1) GC Existe mais de um GC? • O

    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.
  14. Espsilon GC Existe mais de um GC? • No-Op GC;

    -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;
  15. Shenandoah Existe mais de um GC? • Tem como propósito

    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.
  16. ZGC Existe mais de um GC? • ZGC é um

    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;
  17. Qual GC a JVM vai escolher? JVM Ergonomics A) Serial

    B) G1 C) Depende D) ZGC E) Parallel
  18. Qual GC a JVM vai escolher? JVM Ergonomics A) Serial

    B) G1 C) Depende D) ZGC E) Parallel
  19. Qual GC a JVM vai escolher? JVM Ergonomics Se tiver

    2+ processors e > 1792 MB é considerado como um server machine, e será utilizado o G1GC.
  20. Qual GC a JVM vai escolher? JVM Ergonomics Se tiver

    até 1791 MB é considerado como um client machine, e será utilizado o SerialGC.
  21. Quanto de memória devo usar? Boas práticas Aloque 75% da

    memória da heap para JVM. -XX:MaxRAMPercentage=75
  22. Qual GC eu devo utilizar? Boas práticas • Se sua

    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.
  23. Garbage-First (G1) GC - Tuning Boas práticas • XX:MaxGCPauseMillis=200 •

    -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
  24. • O que é o Garbage Collector? • Como funciona

    o GC? • Existe mais de um GC? • JVM Ergonomics • Boas práticas Recapitulando
  25. • GC - https://docs.oracle.com/en/java/javase/20/gctuning/introduction-garbage-collection-tuning.html • G1 Tuning - https://www.oracle.com/technical-resources/articles/java/g1gc.html •

    G1 Step-By-Step - https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html • Ergonomics JVM - https://learn.microsoft.com/en-us/azure/developer/java/containers/overview • GC progress from JDK 8 to JDK 17 - https://kstefanj.github.io/2021/11/24/gc-progress-8-17.html • Java garbage collection: The 10-release evolution from JDK 8 to JDK 18 - https://blogs.oracle.com/javamagazine/post/java-garbage-collectors-evolution • Experimental Garbage Collectors in the JVM - https://www.baeldung.com/jvm-experimental-garbage-collectors • JVM Garbage Collection Basics - https://medium.com/javarevisited/jvm-garbage-collection-basics-edce6791ae98 Recapitulando