Стековая память
Для оптимального запуска приложения, JVM делит память на стек и кучу. Всякий раз, когда мы объявляем новые переменные и объекты, вызываем новый метод, объявляем строку или выполняем аналогичные операции, JVM выделяет память для этих операций либо из стековой памяти, либо из кучи.
Стековая память в Java используется для распределения статической памяти и выполнения потока - каждый поток исполнения в Java имеет свой собственный стек, создаваемый вместе с потоком. Этот стек содержит кадры стека, каждый из которых представляет вызов метода. Каждый кадр содержит примитивные значения, специфичные для метода (переданные в метод и объявленные в нем), и ссылки на объекты, находящиеся в куче.
Стековая память следует принципу LIFO. Последний метод, добавленный в стек при вызове, будет первым, который завершится (выйдет из стека) при завершении выполнения.
Когда метод завершает выполнение, соответствующий ему кадр стека очищается, поток возвращается к вызывающему методу, и место становится доступным для следующего метода.
Ключевые особенности стека:
- Он увеличивается и уменьшается по мере вызова и возврата новых методов соответственно.
- Переменные внутри стека существуют только до тех пор, пока работает метод, создавший их.
- Он автоматически выделяется и освобождается, когда метод завершает выполнение.
- Каждый рекурсивный вызов метода также создает новый кадр стека.
- Если эта память заполнена, Java выдает java.lang.StackOverFlowError.
- Доступ к этой памяти происходит быстрее по сравнению с кучей.
- Эта память является потокобезопасной, поскольку каждый поток работает в своем собственном стеке.