Maison >Java >javaDidacticiel >Pourquoi la profondeur de récursion est-elle non déterministe dans Java 8 mais déterministe dans OpenJDK 7 ?

Pourquoi la profondeur de récursion est-elle non déterministe dans Java 8 mais déterministe dans OpenJDK 7 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-29 06:16:30618parcourir

Why Is Recursion Depth Non-Deterministic in Java 8 but Deterministic in OpenJDK 7?

Profondeur de pile non déterministe en Java 8

La détermination de la profondeur de récursion maximale en Java peut être cruciale pour comprendre l'utilisation de la pile et les problèmes potentiels de mémoire . Cependant, sur Java 8 d'Oracle, les résultats rapportés peuvent être non déterministes, alors qu'en revanche, OpenJDK 7 donne des résultats cohérents.

Influence de HotSpot Optimizer

Le L'optimiseur du compilateur HotSpot affecte considérablement le comportement observé. Lorsque les méthodes récursives sont compilées JIT, l'optimiseur peut optimiser certains appels de méthode ou fusionner les cadres de pile de plusieurs invocations. Cette optimisation conduit à un besoin d'espace de pile plus petit, ce qui permet une récursivité plus profonde.

Exemple

Considérez le code suivant :

<code class="java">public static int countDepth() {
    try { return 1+countDepth(); }
    catch(StackOverflowError err) { return 0; }
}</code>

Résultats avec JIT (à partir de Java 8 d'Oracle) :

2097
4195
4195
4195
12587
12587
12587

Résultats sans JIT (à partir de Java 8 d'Oracle) :

2104
2104
2104
2104
2104
2104
2104

Application de la limite de pile et ASLR

Un autre facteur influençant le non-déterminisme est la manière dont la JVM applique sa limite de pile. Si l'adresse de fin de pile nécessite un alignement spécial (par exemple, un alignement sur les limites de page en raison de restrictions matérielles), l'allocation de pile initiale peut avoir une contrainte d'alignement plus faible. Combiné avec la randomisation de la disposition de l'espace d'adressage (ASLR), cela pourrait entraîner des quantités variables d'espace de pile disponible, conduisant à des profondeurs de récursion non déterministes.

Déterminisme dans OpenJDK 7

Contrairement à Java 8 d'Oracle, OpenJDK 7 semble avoir une application plus cohérente des limites de pile et n'applique pas ASLR par défaut. Ceci explique le comportement déterministe observé dans OpenJDK 7.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn