Подтвердить что ты не робот

Размер стека по умолчанию Java

Я понимаю, что каждый поток имеет свой собственный stack. Примитивные типы и ссылки хранятся в стеке и что в стек не помещается объект. Мои вопросы:

  • Сколько может расти стек? (например, с параметрами - Xms и - Xmx)
  • Можем ли мы ограничить его рост?
  • Имеет ли стек минимальное значение по умолчанию и максимальное значение?
  • Как сборка мусора работает в стеке?
4b9b3361

Ответ 1

Сколько может расти стек?

Вы можете использовать опцию VM с именем ss, чтобы настроить максимальный размер стека. Опция VM обычно передается с использованием -X {option}. Поэтому вы можете использовать java -Xss 1M, чтобы установить максимальный размер стека на 1M.

Каждый поток имеет хотя бы один стек. Некоторые виртуальные машины Java (JVM) помещают Java-стек (вызовы методов Java) и собственный стек (вызовы Native-метода в виртуальной машине) в один стек и выполняют разматывание стека с помощью управляемого Managed to Native Frame, известной как M2NFrame. Некоторые JVM сохраняют два стека отдельно. Xss в большинстве случаев устанавливает размер Java Stack.

Для многих JVM они устанавливают разные значения по умолчанию для размера стека на разных платформах.

Можем ли мы ограничить этот рост?

При вызове метода в стеке этого потока будет создан новый стек стека. Стек будет содержать локальные переменные, параметры, обратный адрес и т.д. В java вы никогда не сможете поместить объект в стек, только ссылка на объект может быть сохранена в стеке. Поскольку массив также является объектом в java, массивы также не хранятся в стеке. Итак, если вы уменьшите количество локальных примитивных переменных, параметры, группируя их в объекты, вы можете уменьшить пространство на стеке. Фактически, тот факт, что мы не можем поместить объекты в стек java, влияет на производительность некоторое время (промахи в кеше).

Имеет ли значение стека минимальное значение по умолчанию или максимальное значение по умолчанию?

Как я уже говорил, разные виртуальные машины отличаются друг от друга и могут изменять версии. См. здесь.

Как работает сбор мусора в стеке?

Коллекции мусора в Java - это горячая тема. Сбор мусора направлен на сбор недостижимого объекта в куче. Так что нужно определение достижимого. Все в стеке является частью корневых ссылок в GC. Все, что доступно из каждой стопки каждой нити, должно рассматриваться как живое. Существуют также некоторые другие корневые ссылки, такие как объекты Thread и некоторые объекты класса.

Это только очень неопределенное использование стека на GC. В настоящее время большинство JVM используют GC поколения. В этой статье приводится краткое описание Java GC. И недавно я прочитал очень хорошую статью, рассказывающую о GC на .net. GC на oracle jvm довольно похож, поэтому я думаю, что это также может помочь вам.

Ответ 2

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

Чтобы ответить на ваши конкретные вопросы:

  • См. этот вопрос о том, как увеличить размер стека.
  • Вы можете ограничить рост стека:
    • группировка многих локальных переменных в объекте: этот объект будет храниться в куче, и только ссылка хранится в стеке
    • ограничить количество вложенных вызовов функций (обычно, не используя рекурсию)
  • Для окон размер стека по умолчанию составляет 320 тыс. для 32-битных и 1024 тыс. для 64-битных, см. эту ссылку.