Diagnóstico de código Java: Mejorar el rendimiento de su código Java ( alt ) explica por qué la JVM no admite la optimización de llamadas finales.
Pero aunque se sabe cómo transformar automáticamente una función recursiva de cola en un bucle simple, la especificación de Java no requiere que se realice esta transformación. Presumiblemente, una de las razones por las que no es un requisito es que, en general, la transformación no se puede realizar de forma estática en un lenguaje orientado a objetos. En cambio, la transformación de una función recursiva de cola a un bucle simple debe realizarse dinámicamente mediante un compilador JIT.
Luego da un ejemplo de código Java que no se transforma.
Entonces, como muestra el ejemplo del Listado 3, no podemos esperar que los compiladores estáticos realicen la transformación de la recursividad de la cola en el código Java mientras preservan la semántica del lenguaje. En cambio, debemos confiar en la compilación dinámica por parte del JIT. Dependiendo de la JVM, el JIT puede o no hacer esto.
Luego proporciona una prueba que puede utilizar para averiguar si su JIT hace esto.
Naturalmente, dado que se trata de un documento de IBM, incluye un enchufe:
Ejecuté este programa con un par de SDK de Java y los resultados fueron sorprendentes. La ejecución en Sun's Hotspot JVM para la versión 1.3 revela que Hotspot no realiza la transformación. En la configuración predeterminada, el espacio de la pila se agota en menos de un segundo en mi máquina. Por otro lado, la JVM de IBM para la versión 1.3 ronronea sin problemas, lo que indica que transforma el código de esta manera.