Java 在同一代码的一台计算机上获取堆栈溢出错误,但在另一台计算机上获取堆栈溢出错误

Java 在同一代码的一台计算机上获取堆栈溢出错误,但在另一台计算机上获取堆栈溢出错误,java,recursion,stack-overflow,Java,Recursion,Stack Overflow,我试图在给定初始状态和特定目标规范的情况下,用Java实现一个特定的谜题求解器。由于各种原因,我无法共享实际代码,这可能并不重要。基本算法是使用递归深度优先搜索,试图找到一个逐步解决难题的方法。需要注意的是,目标规范可能从初始状态就无法访问。显然,递归可能非常深入,并且在堆栈上非常密集 该代码可以完美地处理小难题,也可以处理一些较大的难题。我正在运行一组具有大量输入的测试用例。在我的Macbook上,某些测试用例通过,但在另一台计算机上,这些相同的测试用例,在相同的代码上,由于StackOver

我试图在给定初始状态和特定目标规范的情况下,用Java实现一个特定的谜题求解器。由于各种原因,我无法共享实际代码,这可能并不重要。基本算法是使用递归深度优先搜索,试图找到一个逐步解决难题的方法。需要注意的是,目标规范可能从初始状态就无法访问。显然,递归可能非常深入,并且在堆栈上非常密集

该代码可以完美地处理小难题,也可以处理一些较大的难题。我正在运行一组具有大量输入的测试用例。在我的Macbook上,某些测试用例通过,但在另一台计算机上,这些相同的测试用例,在相同的代码上,由于StackOverflower错误而失败。另一台计算机运行得更快,所以让这些测试用例像在我的Macbook上一样工作对我来说是最有利的。您可以放心地排除由于无限递归导致堆栈溢出错误的可能性-我知道这是因为堆栈正在耗尽

我运行了以下命令:

在我的macbook上:

$ 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)