【发布时间】:2015-12-07 21:14:50
【问题描述】:
我在“stackoverflow”站点中询问有关“java 堆栈溢出”的问题 :)
对特定输入进行一些递归函数调用的特定线程在 Oracle Java 7(64 位) 中运行良好,配置的堆栈大小为 228k (-Xss228k)。
但是,在同一堆栈的 Oracle Java 8(64 位) 中,对于同一输入运行同一递归代码的同一线程会引发 java.lang.StackOverflowError大小为 228k。如果堆栈大小增加到 512k (-Xss512k),它在 Java 8 中运行良好。
知道为什么会发生这种情况吗?与 Java 7 相比,Java 8(Hotspot JVM)是否进行了任何更改,这可能会增加递归函数调用的堆栈内存消耗?如果需要,我可以提供更多详细信息。
(编辑)注意:相同的递归深度在 Java 7 中“总是”有效,但在 Java 8 中“总是”失败,堆栈大小为 228k。
【问题讨论】:
-
堆栈消耗不是完全可预测的。如果没有代码示例,就无法判断几十个可能的原因中的一个是否适用于您的特定问题。参见例如“Why is the max recursion depth I can reach non-deterministic?”
-
@Holger 相同的递归深度在 Java 7 中“总是”有效,但在 Java 8 中“总是”失败,堆栈大小为 228k。那么,非确定性因素是否仍然适用于我的场景?同时,我会尽快想出一个代码示例。
-
你的 JVM 都是 64 位的吗?都是32位的?一个是32,另一个是64?
-
@TagirValeev 两个 JVM 都是 64 位的。
标签: memory recursion java-8 stack-overflow jvm-hotspot