我有一个Java应用程序,它使用在Linux和Windows上运行良好的Xerces解析大型xml架构(.xsd),但在Solaris上提供StackOverflowError,具有完全相同的输入和配置。我知道Xerces使用递归来验证xml架构,但由于它在Windows和Linux上没有出现任何问题,我非常有信心它可以在任何地方运行。
为什么会这样?有解决方法吗?
答案 0 :(得分:5)
根据this page,默认堆栈大小取决于操作系统。
Sparc: 512
Solaris x86: 320(在5.0及更早版本中为256之前)(更新:根据this page,主线程堆栈的大小来自ulimit。主线程堆栈由vm人为地减少到-Xss值)
Sparc 64位: 1024
Linux amd64: 1024(5.0及更早版本中为0)(更新:默认大小来自ulimit,但我可以使用-Xss减少)
Windows: 256(也是here)
您可以使用 -Xss 标志更改默认设置。例如:
java ... -Xss1024k ... <classname>
会将默认堆栈大小设置为1Mb。
答案 1 :(得分:1)
请注意,对于不同的体系结构,Hotspot VM参数默认为may be different。我将确定Windows / Linux下的默认值,并尝试为Solaris设置默认值。
例如:
-XX:ThreadStackSize = 512 - 线程堆栈大小(以KB为单位)。 (0表示使用默认堆栈大小)[Sparc:512; Solaris x86:320(在5.0及更早版本中为256之前的版本); Sparc 64位:1024; Linux amd64:1024(5.0及更早版本中为0);所有其他人.0。]
(我不是建议这个特殊参数是问题。仅仅强调它在不同操作系统下的差异)
答案 2 :(得分:1)
这可能是因为平台之间的默认最大堆栈大小不同。
您可以使用-Xss命令行指定堆栈大小,例如
java -Xss256k
对于256k堆栈。这是基于每个线程分配的。
答案 3 :(得分:-1)
来自javadoc:
<强>的StackOverflowError 强>:
当发生堆栈溢出时抛出,因为应用程序过于冗长。
为每种方法创建的堆栈大小是依赖于实现。这就是原因。