У нас есть ошибка нехватки памяти для кучи, но (просто из любопытства спрашиваю) существует ли эквивалентное ограничение на размер отдельного стека? Если нет, то что предотвращает такое переполнение, если для кадра стека требуется избыточная память (например, тысячи локальных переменных и т. д.)?
Существует ли верхний предел размера кадра стека?
Ответы (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
number of stack frames
больше. Я говорю о том, что individual stack
занимает много места
- person JavaDeveloper; 25.10.2013
Я думаю, что пространство, выделенное для стека времени выполнения, предназначено для всех ваших кадров стека в одном потоке выполнения.
Размер по умолчанию отличается для большинства операционных систем. Взгляните на эти документы. При необходимости вы можете увеличить размер с помощью параметра -Xss
JVM.
http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html
Каждый поток получает собственное выделение пространства стека. Вы можете установить размер этого выделения с помощью опции -Xss в командной строке Java; значение по умолчанию отличается на разных платформах, но это всегда сумма «за поток».
Ограничение — это объем памяти на поток, а не количество записей в стеке.