Coleta de lixo e compilação Just-In-Time (JIT)

Otimização de Código em Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Coleta de lixo — o básico

Gerenciamento manual de memória (C/C++)

  • Programador aloca e libera memória explicitamente
  • Sujeito a vazamentos

$$

Coleta de lixo no Java

  • Alocação automática de memória
  • Detecção automática de objetos não usados
  • Recuperação automática de memória
Otimização de Código em Java

Como a coleta de lixo funciona

  • Marcar: identificar objetos alcançáveis a partir das raízes
  • Limpar: remover objetos inalcançáveis

Captura de tela 2025-05-11 às 18:58:38.png

Otimização de Código em Java

Coleta de lixo e desempenho

Trade-offs de desempenho do GC

  • Simplifica o desenvolvimento, mas tem implicações de desempenho

$$

Algoritmos de GC

  • JVMs modernas oferecem vários algoritmos de coleta de lixo
  • A escolha depende dos requisitos da aplicação
  • Um guia detalhado sobre algoritmos de GC está disponível aqui
1 https://www.baeldung.com/jvm-garbage-collectors
Otimização de Código em Java

Impacto do GC no desempenho

// Ruim - Criar muitos objetos de curta duração
for (int i = 0; i < 1000000; i++) {
    new Object(); // Vira lixo imediatamente
}


// vs. Reutilizar objetos Object obj; for (int i = 0; i < 1000000; i++) { obj = new Object(); // Apenas uma referência }
Otimização de Código em Java

Código amigável ao GC

// Evite isso em código crítico de desempenho
String result = "";
for (int i = 0; i < 100000; i++) {
    result += i; // Cria uma nova String a cada vez
}


// Abordagem melhor StringBuilder builder = new StringBuilder(); for (int i = 0; i < 100000; i++) { builder.append(i); // Reutiliza o mesmo buffer } String result = builder.toString();
Otimização de Código em Java

Compilação Just-In-Time

  • Processo de execução da JVM:
    • Código-fonte Java -> bytecode
    • Bytecode -> execução interpretada
    • Métodos quentes -> código nativo de máquina
  • Otimiza código executado com frequência
Otimização de Código em Java

Padrões de código amigáveis ao JIT

  • Escreva código previsível
// Ramificações previsíveis ajudam a otimização do JIT
if (value > 0) {
    // Código A - caminho mais frequente
} else {
    // Código B - caminho raro
}
  • Crie métodos focados e menores
  • Métodos pequenos e frequentes são ideais para inlining
  • Código complexo pode ser otimizado de forma menos eficaz
Otimização de Código em Java

Resumo

  • Minimize a criação de objetos em caminhos críticos de desempenho
  • Escreva código previsível que aproveite as otimizações do JIT
  • Foque a otimização no que realmente importa, após fazer profiling
Otimização de Código em Java

Vamos praticar!

Otimização de Código em Java

Preparing Video For Download...