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!