Java 在同一代码的一台计算机上获取堆栈溢出错误,但在另一台计算机上获取堆栈溢出错误
我试图在给定初始状态和特定目标规范的情况下,用Java实现一个特定的谜题求解器。由于各种原因,我无法共享实际代码,这可能并不重要。基本算法是使用递归深度优先搜索,试图找到一个逐步解决难题的方法。需要注意的是,目标规范可能从初始状态就无法访问。显然,递归可能非常深入,并且在堆栈上非常密集 该代码可以完美地处理小难题,也可以处理一些较大的难题。我正在运行一组具有大量输入的测试用例。在我的Macbook上,某些测试用例通过,但在另一台计算机上,这些相同的测试用例,在相同的代码上,由于StackOverflower错误而失败。另一台计算机运行得更快,所以让这些测试用例像在我的Macbook上一样工作对我来说是最有利的。您可以放心地排除由于无限递归导致堆栈溢出错误的可能性-我知道这是因为堆栈正在耗尽 我运行了以下命令: 在我的macbook上:Java 在同一代码的一台计算机上获取堆栈溢出错误,但在另一台计算机上获取堆栈溢出错误,java,recursion,stack-overflow,Java,Recursion,Stack Overflow,我试图在给定初始状态和特定目标规范的情况下,用Java实现一个特定的谜题求解器。由于各种原因,我无法共享实际代码,这可能并不重要。基本算法是使用递归深度优先搜索,试图找到一个逐步解决难题的方法。需要注意的是,目标规范可能从初始状态就无法访问。显然,递归可能非常深入,并且在堆栈上非常密集 该代码可以完美地处理小难题,也可以处理一些较大的难题。我正在运行一组具有大量输入的测试用例。在我的Macbook上,某些测试用例通过,但在另一台计算机上,这些相同的测试用例,在相同的代码上,由于StackOver
$ java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'
uintx AdaptivePermSizeWeight = 20 {product}
intx CompilerThreadStackSize = 0 {pd product}
uintx ErgoHeapSizeLimit = 0 {product}
uintx InitialHeapSize = 0 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize = 132120576 {product}
uintx MaxPermSize = 85983232 {pd product}
uintx PermSize = 21757952 {pd product}
intx ThreadStackSize = 1024 {pd product}
intx VMThreadStackSize = 1024 {pd product}
在另一台计算机(使用Ubuntu)上,我运行了:
那么,这里出了什么问题?为什么我的macbook在另一台机器堆栈溢出的情况下运行测试而没有发生意外
我不确定这里有什么额外的信息会有帮助,但如果必要的话我可以提供
编辑:java-version
在Macbook上:
java version "1.6.0_32"
Java(TM) SE Runtime Environment (build 1.6.0_32-b05-420)
Java HotSpot(TM) 64-Bit Server VM (build 20.7-b02-420, mixed mode)
在Ubuntu上:
java version “1.8.0_45”
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
即使堆栈大小相同,堆栈的实际使用情况也可能不同。这可能取决于:
- JVM供应商
- JVM版本(即使小版本中的更改也可能导致不同的堆栈使用)
- 操作系统
- 无论是解释方法,JIT都由C1或C2编译器编译(C2编译的方法通常消耗更少的堆栈)
- 一些随机启动条件(即使在同一个框中,不同启动时堆栈的使用也可能不同)
您可以查看和以了解更多详细信息。建议重新编写算法,消除堆栈压力。例如,使用
ArrayDeque
表示状态堆栈,并用循环替换递归。都使用相同的Java安装和版本吗?例如,两台机器上的热点1.8.045?或者其中一个有OpenJDK,或者在某些方面有所不同?两个java版本都有64位操作系统。它们是不同的,但我很难相信更高版本会导致“较差”的性能。@user1729709,哈!Java6对Java8!当然,栈的用法是不同的,Java6和Java8之间有很多变化。而且不太可能花费太多时间来确保堆栈深度永远不会增加——还有更重要的事情需要优化。
java version “1.8.0_45”
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)