Увеличение пространства стека одного рабочего -потока в java

В моем веб-приложении Java у меня есть один фоновый -рабочий поток, который требует много места в стеке, потому что он запускает действительно сложный рабочий процесс с использованием механизма рабочего процесса activiti и задач groovy script.

В настоящее время мне нужно установить параметр JVM Xss до 16 МБ на 64-битной Java и Tomcat, чтобы обойти любые ошибки StackOverflowError. Если возникает ошибка, трассировка стека действительно огромна (длиной в несколько сотен строк ), но все это происходит внутри движка, поэтому я ничего не могу с этим поделать.

Теперь мой вопрос: :есть ли способ увеличить размер стека одного потока во время выполнения?

Я хотел бы понизить настройки Xss JVM по умолчанию для всех потоков в приложении до 512 КБ, чего, как я знаю, достаточно, и запустить работника только с 16M.

API Java предоставляет некоторую информацию по этой теме для конструктора класса Thread :

public Thread(ThreadGroup group,
              Runnable target,
              String name,
              long stackSize)

. но упоминается, что поведение не гарантируется([1] )и я не нашел никакой информации, будет ли это работать на окнах.

Также,если пространство стека одного потока нельзя увеличить, и я должен указать 16 МБ в качестве значения по умолчанию, каковы будут последствия такого высокого значения? Означает ли это, что каждый новый поток будет резервировать 16 МБ памяти при инициализации (, то есть 200 потоков *16 МБ :3,2 ГБ )?

Насколько я могу судить по jconsole и taskmgr, объем памяти, похоже, не сильно изменился с момента увеличения настроек Xss, но, возможно, я что-то упускаю.

Любая помощь или разъяснение будут оценены.

[1] :http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#Thread(java.lang.ThreadGroup , java.lang.Runnable, java.lang.String, long)

6
задан Peter Lawrey 19 March 2016 в 18:29
поделиться