Maison >Java >javaDidacticiel >Quel est l'impact de l'optimisation JIT de Java 8 sur la profondeur de récursion maximale ?
Détermination de la profondeur de récursion
Pour évaluer la profondeur maximale de récursion, il est souvent souhaitable de compter la profondeur actuelle de la pile et les niveaux de récursion qui peut être exécuté avant de déclencher une StackOverflowError.
Counting Stack Depth
La méthodelevelsDeep() vise à déterminer la profondeur actuelle de la pile en générant et en interceptant une exception et en examinant la trace de pile résultante. Cependant, sa limitation d'une profondeur maximale de 1024 pose un obstacle.
Comptage des niveaux de récursion
La méthode stackLeft() tente de compter la profondeur de pile restante de manière récursive s'appelant jusqu'à ce qu'une StackOverflowError se produise. Cela semble être une approche fiable.
Profondeur de pile non déterministe dans Java 8
De façon inattendue, l'utilisation de stackLeft() avec certaines versions de Java (par exemple, Oracle Java 8) donne des résultats non déterministes. La profondeur de récursion maximale varie entre environ 18 500 et 20 700. Ce comportement n'est pas observé dans OpenJDK 7, où la profondeur reste cohérente.
Cause du non-déterminisme
Ce comportement non-déterministe découle des interactions entre le Hotspot de Java optimiseur et divers facteurs, tels que :
Par conséquent, la profondeur de récursion maximale sur Java 8 peut varier en fonction d'une combinaison de ces facteurs, ce qui rend ce n'est pas déterministe.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!