Стек и куча

Структура памяти в Java достаточно сложна, но на начальном этапе обучения изучим две ее области: стек (stack) и куча (heap). 

1. Куча

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

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

2. Стек

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

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

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

Следующая картинка отображает разницу в создании примитивной и ссылочной переменной. Если создается примитивная локальная переменная int a = 10, то ее значение хранится в стеке. При создании же ссылочной переменной Test a = new Test(), сам объект создается в куче, а переменная Test a - в стеке. Значение переменной Test a - это ссылка на объект в куче.

Структура памяти в Java фото

Read also:
Comments