Когда человек начинает изучать Java или другие языки программирования, он соприкасается с кучей и стеком. Поскольку в начале нет четкого и ясного объяснения, у многих возникает масса вопросов. Что такое куча? что такое стек и в чем разница между кучей и стеком? Хуже всего то, что в Java существует стек, последовательная структура данных «последним пришел — первым вышел» (Last In First Out), то есть java.util.Stack. В этом случае многих людей неизбежно запутает предыдущий вопрос. Фактически, куча и стек являются частями памяти и имеют разные функции, и программе необходимо выделять память в этой области. Как мы все знаем, все программы Java выполняются внутри виртуальной машины JVM. Естественно, здесь мы представляем кучу и стек в (виртуальной) памяти JVM.
разница
Разница между кучей и стеком в Java, естественно, является частым вопросом на собеседованиях. Следующие моменты представляют собой конкретные различия.
Каждый выполняет свои обязанности
Основное отличие состоит в том, что стековая память используется для хранения локальных переменных и вызовов методов.
Память кучи используется для хранения объектов в Java. Будь то переменные-члены, локальные переменные или переменные класса, объекты, на которые они указывают, хранятся в динамической памяти.
Эксклюзивный или общий
Память стека принадлежит одному потоку. Каждый поток будет иметь стековую память, и хранящиеся в нем переменные могут быть видны только в том потоке, которому он принадлежит. То есть стековую память можно понимать как частную память потока.
Объекты в куче памяти видны всем потокам. Доступ к объектам в кученой памяти возможен для всех потоков.
Ошибка исключения
Если в памяти стека нет места для хранения вызовов методов и локальных переменных, JVM выдаст java.lang.StackOverFlowError.
А если в куче памяти нет свободного места для хранения сгенерированного объекта, JVM выдаст java.lang.OutOfMemoryError.
Размер пространства
Память стека намного меньше памяти кучи. Если вы используете рекурсию, ваш стек будет быстро заполняться. Если рекурсия не прерывается вовремя, скорее всего, возникнет проблема StackOverFlowError.
Вы можете установить размер памяти стека с помощью опции -Xss. Параметр -Xms устанавливает начальный размер кучи, а параметр -Xmx устанавливает максимальный размер кучи.
В этом разница между кучей и стеком в Java. Если вы хорошо понимаете эту проблему, это может помочь вам решить проблемы разработки, проанализировать использование памяти кучи и памяти стека и даже выполнить настройку производительности.
Посмотреть значение по умолчанию (обновлено)
Чтобы просмотреть значение кучи по умолчанию, используйте следующий код, где InitialHeapSize — это размер начальной кучи, а MaxHeapSize — максимальное значение кучи.
Скопируйте код кода следующим образом:
13:17 $ java -XX:+PrintFlagsFinal -version | grep HeapSize |
uintx ErgoHeapSizeLimit = 0 {продукт}
uintx HeapSizePerGCThread = 87241520 {продукт}
uintx InitialHeapSize := 134217728 {продукт}
uintx LargePageHeapSizeThreshold = 134217728 {продукт}
uintx MaxHeapSize := 2147483648 {продукт}
Java-версия "1.8.0_25"
Среда выполнения Java(TM) SE (сборка 1.8.0_25-b17)
64-битная серверная виртуальная машина Java HotSpot(TM) (сборка 25.25-b02, смешанный режим)
Проверьте значение стека по умолчанию, где ThreadStackSize — это размер памяти стека.
Скопируйте код кода следующим образом:
13:21 $ java -XX:+PrintFlagsFinal -version | grep ThreadStackSize |
intx CompilerThreadStackSize = 0 {продукт pd}
intx ThreadStackSize = 1024 {PD продукт}
intx VMThreadStackSize = 1024 {продукт pd}
Java-версия "1.8.0_25"
Среда выполнения Java(TM) SE (сборка 1.8.0_25-b17)
64-битная серверная виртуальная машина Java HotSpot(TM) (сборка 25.25-b02, смешанный режим)
Информация о переводе
Исходный текст на английском языке: http://javarevisited.blogspot.com.au/2013/01/difference-between-stack-and-heap-java.html.
Перевод был изменен, организован и удален на основе исходного текста. Если вам интересно, вы можете посетить оригинальный текст. PS адрес заблокирован.