Diagnosticando Código Java: Melhorando o Desempenho de Seu Código Java ( alt ) explica por que a JVM não oferece suporte à otimização de chamada final.
Mas embora seja bem conhecido como transformar automaticamente uma função recursiva de cauda em um loop simples, a especificação Java não exige que essa transformação seja feita. Presumivelmente, um motivo pelo qual não é um requisito é que, em geral, a transformação não pode ser feita estaticamente em uma linguagem orientada a objetos. Em vez disso, a transformação da função recursiva de cauda em loop simples deve ser feita dinamicamente por um compilador JIT.
Em seguida, dá um exemplo de código Java que não se transforma.
Portanto, como mostra o exemplo da Listagem 3, não podemos esperar que os compiladores estáticos realizem a transformação da recursão final no código Java enquanto preservam a semântica da linguagem. Em vez disso, devemos contar com a compilação dinâmica pelo JIT. Dependendo do JVM, o JIT pode ou não fazer isso.
Em seguida, ele fornece um teste que você pode usar para descobrir se seu JIT faz isso.
Naturalmente, como este é um artigo da IBM, inclui um plugue:
Eu executei este programa com alguns SDKs Java e os resultados foram surpreendentes. Executar no Hotspot JVM da Sun para a versão 1.3 revela que o Hotspot não realiza a transformação. Nas configurações padrão, o espaço da pilha se esgota em menos de um segundo na minha máquina. Por outro lado, a JVM da IBM para a versão 1.3 ronrona sem problemas, indicando que ela transforma o código dessa maneira.