Опция JVM -Xss - Что он делает именно?

229

Он говорит здесь , что -Xss используется для «заданного размера стека потока», что это означает? Может ли кто-нибудь помочь мне понять это?

instantsetsuna
источник
Некоторые примеры здесь (не мои ...): herongyang.com/JVM/…
Кристоф

Ответы:

269

Каждый поток в приложении Java имеет свой собственный стек . Стек используется для хранения адресов возврата, аргументов вызова функции / метода и т. Д. Поэтому, если поток стремится обрабатывать большие структуры с помощью рекурсивных алгоритмов, ему может понадобиться большой стек для всех этих адресов возврата и тому подобное. С Sun JVM вы можете установить этот размер с помощью этого параметра.

TJ Crowder
источник
11
Таким образом, опция -Xss используется для ограничения объема памяти, используемого стеком (путем хранения адресов возврата, переменных и т. Д.), А также косвенно ограничивает, насколько глубоким может быть стек? Я прав?
instantsetsuna
5
@instantsetsuna: я думаю, что более распространенное использование - это увеличение лимита по умолчанию. (Всегда есть предел.) Но да, вы контролируете размер стека, который контролирует, насколько глубоким может быть стек.
TJ Crowder
Как вы делаете эквивалент этого параметра XSS на компиляторе Java (также известный как Javac)? Это проблема для тех, кто использует основанные на Scala библиотеки, которые приводят к большой рекурсии хвоста при компиляции классов - Эндрю Норман 9 секунд назад
Эндрю Норман
@AndrewNorman: Вы не компилируете параметры времени выполнения Java в файл класса, это больше зависит от среды. Если вам действительно нужно сделать это в коде, вы можете написать крошечный основной класс, единственной задачей которого является запуск вашего реального приложения с нужными вам опциями.
TJ Crowder
@AndrewNorman Вы можете задать флаги конфигурации JVM, с которыми должен работать компилятор с использованием -Jflagсинтаксиса (например, -J-Xss).
francoisr
166

Это действительно устанавливает размер стека на JVM.

Вы должны прикоснуться к нему в любой из этих двух ситуаций:

  • StackOverflowError (размер стека больше лимита), увеличьте значение
  • OutOfMemoryError: невозможно создать новый собственный поток (слишком много потоков, каждый поток имеет большой стек), уменьшить его.

Последнее обычно происходит, когда ваш Xss установлен слишком большим - тогда вам нужно сбалансировать его (тестирование!)

Адам Адамашек
источник
3
Не обязательно каждый раз на самом деле. И SOE, и OOME могут возникать по разным причинам, которые должны быть исправлены по-разному.
Noego
4
Правда, но я не сказал, что -Xss является единственной причиной для SOE и OOME, но наоборот - если установлен неправильно, это может привести к одному из двух.
Адам Адамашек
5

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

Питер Лори
источник
4

Если я не ошибаюсь, это то, что сообщает JVM, сколько последовательных вызовов он примет перед выпуском StackOverflowError. Не то, что вы хотите изменить вообще.

Kellindil
источник