Eita, não sabia que podia variar tanto esse cold start do java. Na segunda execução já caia significativamente o tempo execução? Ou precisa de algumas para ensinar bem o JIT como se comportar??
Não sei exatamente te dizer quantos vezes precisa, mas depois de umas 5 requisições ia de 4 segundos pra 300ms. Como o ambiente era homologação, tinha poucas requisições em outros serviços, o que deve ter ajudado o HotSpot a otimizar ainda mais esse que eu testei.
Não é necessariamente o _hotspot_, ainda mais pra poucas requisições. Tem outras coisas que podem ter contribuído para este resultado.
Quando a JVM começa a executar, tem uma série de coisas que ela precisa fazer para iniciar. Por exemplo, tem [várias estruturas internas que ela precisa inicializar](https://howtodoinjava.com/java/garbage-collection/java-memory-model/), o *classloader* tem que carregar várias classes, etc. Por isso até hoje Java é conhecida por ter um *startup* mais lento que as outras linguagens.
Isso já explicaria a primeira requisição ser mais lenta, porque apesar de muitas classes nativas já terem sido carregadas, várias outras (incluindo as classes envolvidas no teste) só o são sob demanda. Por isso que muitas libs de benchmarking costumam ter uma fase de *warmup* para que esta demora inicial não interfira nos resultados.
**Aliás, fica a dica de testar usando alguma dessas libs**, [em vez de comparar os timestamps](https://stackoverflow.com/q/504103). Para testes simples eu uso o [JMH](https://github.com/openjdk/jmh), mas existem várias outras (busque por "_java benchmark tools_" e escolha a sua).
Também pode ser que o Garbage Collector tenha rodado no meio do teste, interferindo no tempo de resposta. Apesar dos algoritmos de GC terem melhorado, o impacto deste nunca é zero. Pra isso, precisaria analisar com mais detalhes (pesquise por "ferramentas de *profiling*").
E vale notar que até aqui, não temos nada de _hotspot_.
---
O mecanismo de *hotspot* (que é parte de algumas JVM's, entenda melhor [aqui](https://stackoverflow.com/q/16568253)) é o que faz com que um código que tenha executado "muitas vezes" seja otimizado. Neste caso o JIT (_just in time compiler_) entra em ação e re-compila aquele trecho para código de máquina (na verdade é um pouco mais complicado que isso, veja [aqui](https://stackoverflow.com/a/4908698)).
Mas este mecanismo só entra em ação depois de **muitas** execuções. O valor exato é difícil de determinar, conforme explicado [aqui](https://stackoverflow.com/q/35601841), mas garanto que somente 5 execuções não é nem perto do suficiente para ativar o _hotspot_.