StackOverflowError в Solaris, но не в Linux / Windows - PullRequest
1 голос
/ 20 мая 2009

У меня есть приложение Java, которое анализирует большую XML-схему (.xsd) с помощью Xerces, которая отлично работает в Linux и Windows, но выдает ошибку StackOverflowError в Solaris с точно такими же входными данными и конфигурацией. Я знаю, что Xerces использует рекурсию для проверки XML-схем, но, поскольку это не создавало проблем в Windows и Linux, я был уверен, что она работает везде.

Почему это происходит? Есть ли обходной путь?

Ответы [ 4 ]

5 голосов
/ 20 мая 2009

Согласно этой странице размер стека по умолчанию зависит от ОС.

Sparc: 512

Solaris x86: 320 (ранее было 256 в 5.0 и более ранних версиях) (обновление: согласно этой странице размер стека основного потока исходит из ulimit Стек основного потока искусственно уменьшается на vm до значения -Xss)

Sparc 64 бит: 1024

Linux amd64: 1024 (было 0 в 5.0 и более ранних версиях) (обновление: размер по умолчанию взят из ulimit, но я могу уменьшить его с -Xss)

Windows: 256 (также здесь )

Вы можете изменить настройку по умолчанию с флагом -Xss . Например:

java ... -Xss1024k ... <classname>

установит размер стека по умолчанию равным 1 МБ.

1 голос
/ 20 мая 2009

Вероятно, это связано с тем, что максимальный размер стека по умолчанию зависит от платформы.

Вы можете указать размер стека с помощью командной строки -Xss для JVM, например,

Java -Xss256k

Для стека 256 КБ. Это распределяется для каждого потока.

1 голос
/ 20 мая 2009

Обратите внимание, что значения по умолчанию для параметра Hotspot VM могут отличаться для разных архитектур. Я бы определил значения по умолчанию в Windows / Linux и попытался установить их для Solaris.

Например:

-XX: ThreadStackSize = 512 - Размер стека потока (в килобайтах). (0 означает использовать размер стека по умолчанию) [Sparc: 512; Solaris x86: 320 (ранее было 256 в 5.0 и более ранних версиях); Sparc 64 бит: 1024; Linux amd64: 1024 (было 0 в 5.0 и ранее); все остальные 0.]

(Я не предполагаю, что этот конкретный параметр является проблемой. Просто выделяя его различия в разных ОС)

0 голосов
/ 20 мая 2009

Цитата из Javadoc:

StackOverflowError
Брошенный, когда переполнение стека происходит, потому что приложение рекурсивно слишком глубоко.

Размер стека, созданного для каждого метода, зависит от реализации . Вот причина.

...