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

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

Exception in thread "main" java.lang.StackOverflowError

Это может быть решено путем увеличения размера стека Java и если так, как я делаю это в Eclipse?

Обновление:

Стрельба по тарелочкам @Jon

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

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

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

59
задан Ether 30 January 2010 в 19:03
поделиться

4 ответа

Откройте Run Configuration для вашего приложения (Выполнить/запустить конфигурацию..., затем найдите запись приложения в 'Java-приложении').

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

80
ответ дан 24 November 2019 в 18:13
поделиться

Добавьте флаг -Xss1024k в VM Arguments.

Также можно увеличить размер стека в mb, например, используя -Xss1m .

10
ответ дан 24 November 2019 в 18:13
поделиться

Вам необходимо запустить конфигурацию запуска внутри Eclipse, чтобы настроить параметры JVM.

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

Это где --xss1024k идет.

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

3
ответ дан 24 November 2019 в 18:13
поделиться

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

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

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

37
ответ дан 24 November 2019 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: