Maison > Java > javaDidacticiel > le corps du texte

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

Linda Hamilton
Libérer: 2024-10-29 06:16:30
original
546 Les gens l'ont consulté

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>
Copier après la connexion

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

2097
4195
4195
4195
12587
12587
12587
Copier après la connexion

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

2104
2104
2104
2104
2104
2104
2104
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal