Ошибка переполнения стека Java – как увеличить размер стека в Eclipse?

Я запускаю программу, написанную на Java в Eclipse. Программа имеет очень глубокий уровень рекурсии для очень больших входов. Для небольших входов программа работает нормально, но когда подаются большие входы, я получаю следующую ошибку:

Exception in thread "main" java.lang.StackOverflowError 

Можно ли это решить, увеличив размер стека Java, и если да, то как это сделать в Eclipse?

Обновить:

@Jon Skeet

Этот код рекурсивно пересекает дерево parsingа, чтобы создать структуру данных. Так, например, код будет выполнять некоторую работу с использованием узла в дереве синтаксического parsingа и вызывать себя на двух дочерних узлах узла, объединяя их результаты, чтобы дать общий результат для дерева.

Общая глубина рекурсии зависит от размера дерева синтаксического анализа, но код, кажется, терпит неудачу (без большого стека), когда количество рекурсивных вызовов попадает в 1000.

Также я уверен, что код не терпит неудачу из-за ошибки, поскольку он работает для небольших входов.

Откройте « Запустить конфигурацию» для своего приложения («Запустить / запустить конфигурации …», затем найдите запись приложений в «Java-приложении»).

Вкладка «Параметры» содержит аргументы Vm текстового поля, введите -Xss1m (или больший параметр для максимального размера стека). Значение по умолчанию – 512 кбайт (SUN JDK 1.5 – не знаю, зависит ли оно от поставщиков и версий).

Это может быть излечимо за счет увеличения размера стека, но лучшим решением будет выработка того, как избежать рекурсии. Рекурсивное решение всегда может быть преобразовано в итеративное решение, которое значительно улучшит масштаб вашего кода. В противном случае вы действительно будете угадывать, сколько стека предоставить, что может быть даже не очевидно из ввода.

Вы абсолютно уверены, что это неудачно из-за размера ввода, а не ошибки в коде, между прочим? Насколько глубока эта recursion?

EDIT: Хорошо, увидев обновление, я лично попытаюсь переписать его, чтобы избежать использования рекурсии. Обычно наличие Stack «вещей, которые все еще делают» – хорошая отправная точка для удаления рекурсии.

Добавьте флаг -Xss1024k в аргументы VM.

Вы также можете увеличить размер стека в mb с помощью -Xss1m .

У меня также такая же проблема при анализе файлов определения схемы (XSD) с использованием библиотеки XSOM,

я смог увеличить стек памяти до 208 Мб, тогда он показал heap_out_of_memory_error для которого я смог увеличить только до 320 Мб.

окончательная конфигурация была -Xmx320m -Xss208m но затем снова она работала некоторое время и не удалась.

Моя функция рекурсивно реплицирует все дерево определения схемы, удивительно, что выходной файл пересек 820 Мб для файла определения 4 Мб (библиотека Aixm), который, в свою очередь, использует 50 Мб библиотеки определения схемы (ISO gml).

с этим я убежден, что мне нужно избегать рекурсии, а затем начать итерацию и другой способ представления вывода, но у меня мало проблем с преобразованием всей этой рекурсии на итерацию.

Для настройки параметров JVM необходимо иметь конфигурацию запуска внутри Eclipse.

После запуска вашей программы с помощью F11 или Ctrl-F11 откройте конфигурацию запуска в Run -> Run Configurations … и откройте свою программу в разделе «Приложения Java». Выберите панель «Аргументы», где вы найдете «аргументы VM».

Здесь -Xss1024k .

Если вы хотите, чтобы конфигурация запуска была файлом в вашей рабочей области (так что вы можете щелкнуть правой кнопкой мыши и запустить его), выберите «Общая панель» и установите флажок «Сохранить как -> Общий файл» и перейдите к местоположению, в котором вы хотите получить файл запуска. Обычно я имею их в отдельной папке, поскольку мы проверяем их на CVS.

Когда аргумент -Xss не выполняет задание, попробуйте удалить временные файлы из:

 c:\Users\{user}\AppData\Local\Temp\. 

Это помогло мне.

Посмотрите на обход дерева Morris по порядку, который использует постоянное пространство и работает в O (n) (до 3 раз дольше, чем ваш обычный рекурсивный обход, но вы экономите очень много места). Если узлы являются модифицируемыми, вы можете сохранить вычисленный результат поддерева по мере того, как вы возвращаетесь к его корню (путем записи непосредственно в узел).

Давайте будем гением компьютера.