Menentukan Kedalaman Rekursi
Untuk mengukur kedalaman maksimum rekursi, selalunya wajar untuk mengira kedalaman tindanan semasa dan tahap rekursi yang boleh dilaksanakan sebelum mencetuskan StackOverflowError.
Mengira Kedalaman Tindanan
Kaedah levelsDeep() bertujuan untuk menentukan kedalaman tindanan semasa dengan menjana dan menangkap pengecualian dan memeriksa jejak timbunan yang terhasil. Walau bagaimanapun, had kedalaman maksimum 1024 menimbulkan halangan.
Mengira Tahap Rekursi
Kaedah stackLeft() cuba mengira baki kedalaman tindanan secara rekursif memanggil dirinya sendiri sehingga StackOverflowError berlaku. Ini nampaknya merupakan pendekatan yang boleh dipercayai.
Kedalaman Tindanan Bukan Deterministik dalam Java 8
Tanpa diduga, menggunakan stackLeft() dengan versi Java tertentu (mis., Oracle Java 8) menghasilkan keputusan yang tidak pasti. Kedalaman pengulangan maksimum berbeza-beza antara kira-kira 18,500 dan 20,700. Tingkah laku ini tidak diperhatikan dalam OpenJDK 7, di mana kedalaman kekal konsisten.
Punca Non-Determinisme
Tingkah laku bukan deterministik ini berpunca daripada interaksi antara Hotspot Java pengoptimum dan pelbagai faktor, seperti:
Oleh itu, kedalaman rekursi maksimum pada Java 8 boleh berbeza-beza bergantung pada gabungan faktor ini, menjadikan ia tidak menentukan.
Atas ialah kandungan terperinci Bagaimanakah Pengoptimuman JIT Java 8 Memberi Impak Kedalaman Ulangan Maksimum?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!