O tópico é bem antigo, mas, como o assunto anda em relevância no momento, acho pertinente lançar o poder da fênix aqui
O lance da GraalVM é basicamente o tipo do seu workload. Workloads curtos são uma ótima pedida pra usar a GraalVM, como FaaS. Aplicações “tradicionais”, que tem tempo de vida determinado somente pelo tempo antes de falharem, vão se beneficiar da JVM tradicional. Basicamente o Garbage Collector da JVM consegue se sair melhor no longo prazo.
O interessante foi que, em cima da GraalVM, houve um esforço muito legal pra criar um framework que tira proveito disso: o Quarkus. Ele consegue lidar com o trabalho super massivo e tedioso que é configurar a GraalVM e ainda coloca mais algumas cerejas no bolo que podem ser usadas com a JVM também.
Onde se tira muito proveito da GraalVM é em escalabilidade pra nuvem, já que você vai ter containers com footprint e bootstrap muito menores, o que irá fazer sua app escalar assustadoramente mais rápido. O preço que você vai pagar por isso é na compilação: compilar com a GraalVM é assustadoramente demorado e consome muitos recursos, então você precisa preparar uma estrutura pra builds.
O problema vem quando você faz muitos builds, mas escala pouco a aplicação: ter vários builds e poucos containers te darão mais dores de cabeça do que se você tiver poucos builds e muitos containers (mais um motivo pro workload curto se encaixar melhor na GraalVM).
Atualmente eu não faço mais nada que não esteja com Quarkus, e em alguns casos uso a GraalVM (principalmente em ferramentas de linha de comando, como um gerador de payload que eu fiz ano passado). O fato da GraalVM não aceitar muita “magia negra” (aka: Reflection) te faz precisar de ahead of time compilation, deixando estruturas caras já prontas no início da aplicação (como a resolução das dependências do CDI, por exemplo). O Quarkus já faz isso com um monte de frameworks, mesmo se você usar a JVM. Caso opte pela GraalVM, o Quarkus também pode serializar um bloco estático de processamento e deserializar ele no início da aplicação, dando um fôlego extra de desempenho (mais um motivo do processo de compilação ser mais demorado).
Bom, é um tema super interessante e que depois de muito tempo apanhando com os prós e contras eu uso a seguinte regra:
- Workload de curta duração: GraalVM
- Workload de longa duração: JVM
Até agora tá dando super certo