确定递归深度
要测量递归的最大深度,通常需要计算当前堆栈深度和递归级别可以在触发 StackOverflowError 之前执行。
计算堆栈深度
levelsDeep() 方法旨在通过生成和捕获异常并检查来确定当前堆栈深度产生的堆栈跟踪。然而,其最大深度为 1024 的限制带来了障碍。
计算递归级别
stackLeft() 方法尝试通过递归来计算剩余的堆栈深度调用自身直到发生 StackOverflowError。这似乎是一种可靠的方法。
Java 8 中的非确定性堆栈深度
意外地,在某些版本的 Java(例如 Oracle Java)中使用 stackLeft() 8) 产生不确定的结果。最大递归深度大约在 18,500 到 20,700 之间变化。在深度保持一致的 OpenJDK 7 中没有观察到这种行为。
非确定性的原因
这种非确定性行为源于 Java 热点之间的交互优化器和各种因素,例如:
因此,Java 8 上的最大递归深度可能会根据这些因素的组合而变化,使得它是不确定的。
以上是Java 8 的 JIT 优化如何影响最大递归深度?的详细内容。更多信息请关注PHP中文网其他相关文章!