Диагностика кода Java: повышение производительности кода Java ( alt ) объясняет, почему JVM не поддерживает оптимизацию хвостового вызова.
Но хотя хорошо известно, как автоматически преобразовывать хвостовую рекурсивную функцию в простой цикл, спецификация Java не требует этого преобразования. По-видимому, одна из причин, по которой это не является обязательным требованием, заключается в том, что в целом преобразование не может быть выполнено статически на объектно-ориентированном языке. Вместо этого преобразование от хвостовой рекурсивной функции к простому циклу должно выполняться динамически JIT-компилятором.
Затем он дает пример кода Java, который не трансформируется.
Итак, как показывает пример в листинге 3, мы не можем ожидать, что статические компиляторы выполнят преобразование хвостовой рекурсии в Java-коде при сохранении семантики языка. Вместо этого мы должны полагаться на динамическую компиляцию JIT. В зависимости от JVM JIT может это делать, а может и не делать.
Затем он дает тест, который вы можете использовать, чтобы выяснить, делает ли это ваша JIT.
Естественно, поскольку это статья IBM, она включает в себя заглушку:
Я запустил эту программу с парой Java SDK, и результаты были удивительными. Запуск JVM Sun Hotspot для версии 1.3 показывает, что Hotspot не выполняет преобразование. При настройках по умолчанию пространство стека на моем компьютере исчерпывается менее чем за секунду. С другой стороны, JVM IBM для версии 1.3 мурлычет без проблем, указывая на то, что она действительно преобразует код таким образом.