Solaris上的StackOverflowError但Linux / Windows上没有

时间:2009-05-20 13:35:20

标签: java xml xerces

我有一个Java应用程序,它使用在Linux和Windows上运行良好的Xerces解析大型xml架构(.xsd),但在Solaris上提供StackOverflowError,具有完全相同的输入和配置。我知道Xerces使用递归来验证xml架构,但由于它在Windows和Linux上没有出现任何问题,我非常有信心它可以在任何地方运行。

为什么会这样?有解决方法吗?

4 个答案:

答案 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
当发生堆栈溢出时抛出,因为应用程序过于冗长。

为每种方法创建的堆栈大小是依赖于实现。这就是原因。