Каков размер стека по умолчанию, может ли он расти, как он работает с сборкой мусора?

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

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

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

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

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

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

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

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

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

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

как garbage collection работает в стеке?

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

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

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

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

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