Chẩn đoán mã Java: Cải thiện hiệu suất của mã Java của bạn ( alt ) giải thích lý do tại sao JVM không hỗ trợ tối ưu hóa cuộc gọi đuôi.
Nhưng mặc dù đã biết cách tự động biến đổi một hàm đệ quy đuôi thành một vòng lặp đơn giản, nhưng đặc tả Java không yêu cầu phải thực hiện chuyển đổi này. Có lẽ, một lý do khiến nó không phải là một yêu cầu là nói chung, việc chuyển đổi không thể được thực hiện một cách tĩnh trong một ngôn ngữ hướng đối tượng. Thay vào đó, việc chuyển đổi từ hàm đệ quy đuôi sang vòng lặp đơn giản phải được thực hiện động bởi trình biên dịch JIT.
Sau đó, nó đưa ra một ví dụ về mã Java sẽ không biến đổi.
Vì vậy, như ví dụ trong Liệt kê 3 cho thấy, chúng ta không thể mong đợi các trình biên dịch tĩnh thực hiện chuyển đổi đệ quy đuôi trên mã Java trong khi vẫn bảo toàn ngữ nghĩa của ngôn ngữ. Thay vào đó, chúng ta phải dựa vào biên dịch động của JIT. Tùy thuộc vào JVM, JIT có thể thực hiện hoặc không.
Sau đó, nó đưa ra một bài kiểm tra mà bạn có thể sử dụng để tìm hiểu xem JIT của bạn có thực hiện điều này hay không.
Đương nhiên, vì đây là một bài báo của IBM, nó bao gồm một phích cắm:
Tôi đã chạy chương trình này với một vài Java SDK và kết quả thật đáng ngạc nhiên. Chạy trên Hotspot JVM của Sun cho phiên bản 1.3 cho thấy rằng Hotspot không thực hiện chuyển đổi. Ở cài đặt mặc định, không gian ngăn xếp sẽ hết trong vòng chưa đầy một giây trên máy của tôi. Mặt khác, JVM của IBM cho phiên bản 1.3 chạy mà không có vấn đề gì, cho thấy rằng nó chuyển đổi mã theo cách này.