การวินิจฉัยรหัส Java: การปรับปรุงประสิทธิภาพของ Java Code ของคุณ ( alt ) อธิบายว่าเหตุใด JVM จึงไม่สนับสนุนการเพิ่มประสิทธิภาพการโทรหาง
แต่ถึงแม้ว่าจะเป็นที่ทราบกันดีว่าจะแปลงฟังก์ชัน tail-recursive โดยอัตโนมัติให้เป็น loop แบบธรรมดาได้อย่างไร แต่ข้อกำหนดของ Java ไม่จำเป็นต้องทำการแปลง สันนิษฐานว่าสาเหตุหนึ่งที่ไม่ใช่ข้อกำหนดก็คือโดยทั่วไปแล้วการเปลี่ยนแปลงไม่สามารถทำแบบคงที่ในภาษาเชิงวัตถุได้ แต่การแปลงจากฟังก์ชัน tail-recursive ไปเป็น simple loop จะต้องทำแบบไดนามิกโดยคอมไพเลอร์ JIT
จากนั้นให้ตัวอย่างโค้ด Java ที่จะไม่แปลง
ดังตัวอย่างในรายการที่ 3 แสดงเราไม่สามารถคาดหวังว่าคอมไพเลอร์แบบคงที่จะทำการแปลงการเรียกซ้ำหางบนโค้ด Java ในขณะที่ยังคงรักษาความหมายของภาษาไว้ แต่เราต้องพึ่งพาการรวบรวมแบบไดนามิกโดย JIT JIT อาจทำหรือไม่ทำทั้งนี้ขึ้นอยู่กับ JVM
จากนั้นจะให้การทดสอบที่คุณสามารถใช้เพื่อดูว่า JIT ของคุณทำสิ่งนี้หรือไม่
โดยปกติแล้วเนื่องจากเป็นกระดาษ IBM จึงมีปลั๊ก:
ฉันรันโปรแกรมนี้ด้วย Java SDK สองสามตัวและผลลัพธ์ก็น่าประหลาดใจ การทำงานบน Sun's Hotspot JVM สำหรับเวอร์ชัน 1.3 เผยให้เห็นว่า Hotspot ไม่ได้ทำการเปลี่ยนแปลง ที่การตั้งค่าเริ่มต้นพื้นที่สแต็กจะหมดภายในเวลาไม่ถึงหนึ่งวินาทีบนเครื่องของฉัน ในทางกลับกัน JVM ของไอบีเอ็มสำหรับเวอร์ชัน 1.3 ส่งเสียงฟี้อย่างไม่มีปัญหาแสดงว่ามันแปลงรหัสด้วยวิธีนี้