Существует ли верхний предел размера кадра стека?

У нас есть ошибка нехватки памяти для кучи, но (просто из любопытства спрашиваю) существует ли эквивалентное ограничение на размер отдельного стека? Если нет, то что предотвращает такое переполнение, если для кадра стека требуется избыточная память (например, тысячи локальных переменных и т. д.)?


person JavaDeveloper    schedule 25.10.2013    source источник


Ответы (3)


Если поток запрашивает больше места в стеке, чем доступно, он получает StackOverflowError.

http://docs.oracle.com/javase/7/docs/api/java/lang/StackOverflowError.html

Размер отдельного кадра стека определяется во время компиляции и сохраняется в файле класса вместе с кодом метода. На самом деле есть два поля: размер массива локальных переменных и глубина стека операндов. Оба ограничены 2^16-1. http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#1546

person Joni    schedule 25.10.2013
comment
Я предполагаю, что переполнение стека происходит, когда number of stack frames больше. Я говорю о том, что individual stack занимает много места - person JavaDeveloper; 25.10.2013
comment
Переполнение стека происходит, когда в стеке осталось меньше места, чем необходимо; не все кадры стека имеют одинаковый размер. Существует ограничение на количество локальных переменных, налагаемое спецификацией файла класса; если вы превысите этот предел, это будет ошибка времени компиляции. Размер кадра стека вычисляется компилятором. - person Joni; 25.10.2013

Я думаю, что пространство, выделенное для стека времени выполнения, предназначено для всех ваших кадров стека в одном потоке выполнения.

Размер по умолчанию отличается для большинства операционных систем. Взгляните на эти документы. При необходимости вы можете увеличить размер с помощью параметра -Xss JVM.

http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html

person yamafontes    schedule 25.10.2013

Каждый поток получает собственное выделение пространства стека. Вы можете установить размер этого выделения с помощью опции -Xss в командной строке Java; значение по умолчанию отличается на разных платформах, но это всегда сумма «за поток».

Ограничение — это объем памяти на поток, а не количество записей в стеке.

person Dawood ibn Kareem    schedule 25.10.2013
comment
Массивы хранятся в куче, а не в стеке. - person Joni; 25.10.2013
comment
Хм, да, вы абсолютно правы. Я не знаю, о чем я думал. Я уберу последнее предложение. - person Dawood ibn Kareem; 25.10.2013