Uma introdução ao Epsilon GC: um coletor de lixo experimental não operacional

Uma introdução ao Epsilon GC: um coletor de lixo experimental não operacional

1. Introdução

Java 11 introduziu umNo-Op Garbage Collector chamado Epsilon, quepromises the lowest GC overhead possible.

Neste breve tutorial, exploraremos como funciona o Epsilon e mencionaremos os casos de uso comuns.

2. Hands-On Rápido

Vamos começar sujando as mãos e dê uma volta pelo Epsilon GC!

Precisamos primeiro de um aplicativo que cria lixo:

class MemoryPolluter {

    static final int MEGABYTE_IN_BYTES = 1024 * 1024;
    static final int ITERATION_COUNT = 1024 * 10;

    static void main(String[] args) {
        System.out.println("Starting pollution");

        for (int i = 0; i < ITERATION_COUNT; i++) {
            byte[] array = new byte[MEGABYTE_IN_BYTES];
        }

        System.out.println("Terminating");
    }
}

Esse código cria matrizes de um megabyte em um loop. Como repetimos o loop 10240 vezes, significa que alocamos 10 gigabytes de memória, o que provavelmente é maior que o tamanho máximo de heap disponível.

Também fornecemos algumas impressões auxiliares para ver quando o aplicativo termina.

Para ativar o Epsilon GC, precisamos passar os seguintes argumentos de VM:

-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

E quando executamos o aplicativo, obtemos o seguinte erro:

Starting pollution
Terminating due to java.lang.OutOfMemoryError: Java heap space

No entanto, quando executamos o mesmo aplicativo com as opções de VM padrão, ele é concluído com perfeição:

Starting pollution
Terminating

Por que a primeira execução falhou? It seems like even the most basic garbage collectors could clean up a brincadeira de criança que acabamos de demonstrar!

Então, vamos dar uma olhada nos conceitos por trás do Epsilon GC para entender o que aconteceu.

3. Como funciona o Epsilon GC

Epsilon é um coletor de lixo não operacional.

JEP 318 explica que “[Epsilon] … handles memory allocation but does not implement any actual memory reclamation mechanism. Once the available Java heap is exhausted, the JVM will shut down.

Então, isso explica porque nosso aplicativo terminou com umOutOfMemoryError.

Mas, levanta a questão: Por que precisamos ter um coletor de lixo, que não coleta lixo?

Existem alguns casos em quewe know that the available heap will be enough, so we don’t want the JVM to use resources to run GC tasks.

Alguns exemplos de tais casos (também do JEP relacionado):

  • Teste de performance

  • Teste de pressão de memória

  • Teste de interface da VM

  • Empregos de vida extremamente curta

  • Melhorias na latência da última gota

  • Melhorias na taxa de transferência da última gota

4. Conclusão

Neste breve artigo, aprendemos sobre o Epsilon, um GC não operacional disponível em Java 11. Aprendemos sobre as implicações do uso e analisamos alguns casos em que isso pode ser útil.

Como de costume, os exemplos estão disponíveisover on GitHub.