Что такое Heap и Stack память в Java? Какая разница между ними?



Heap (куча)
используется Java Runtime для выделения памяти под объекты и классы. Создание нового объекта также происходит в куче. Это же является областью работы сборщика мусора. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться из любой части приложения.



Stack (стек) это область хранения данных также находящееся в общей оперативной памяти (RAM). Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе. Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего метода. Размер стековой памяти намного меньше объема памяти в куче. Стек в Java работает по схеме LIFO (Последний-зашел-Первый-вышел)



Различия между Heap и Stack памятью:

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

• Всякий раз, когда создается объект, он всегда хранится в куче, а в памяти стека содержится лишь ссылка на него. Память стека содержит только локальные переменные примитивных типов и ссылки на объекты в куче.

• Объекты в куче доступны с любой точки программы, в то время как стековая память не может быть доступна для других потоков.

• Стековая память существует лишь какое-то время работы программы, а память в куче живет с самого начала до конца работы программы.

• Если память стека полностью занята, то Java Runtime бросает исключение java.lang.StackOverflowError. Если заполнена память кучи, то бросается исключение java.lang.OutOfMemoryError: Java Heap Space.

• Размер памяти стека намного меньше памяти в куче.

• Из-за простоты распределения памяти, стековая память работает намного быстрее кучи.



Для определения начального и максимального размера памяти в куче используются -Xms и -Xmx опции JVM. Для стека определить размер памяти можно с помощью опции -Xss.