Ответ 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 довольно похож, поэтому я думаю, что это также может помочь вам.