Pascal4eg / Java

 Java | Фишки и трюки

Стековая память

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

Стековая память в Java используется для распределения статической памяти и выполнения потока - каждый поток исполнения в Java имеет свой собственный стек, создаваемый вместе с потоком. Этот стек содержит кадры стека, каждый из которых представляет вызов метода. Каждый кадр содержит примитивные значения, специфичные для метода (переданные в метод и объявленные в нем), и ссылки на объекты, находящиеся в куче.

Стековая память следует принципу LIFO. Последний метод, добавленный в стек при вызове, будет первым, который завершится (выйдет из стека) при завершении выполнения.

Когда метод завершает выполнение, соответствующий ему кадр стека очищается, поток возвращается к вызывающему методу, и место становится доступным для следующего метода.

Ключевые особенности стека:

  • Он увеличивается и уменьшается по мере вызова и возврата новых методов соответственно.
  • Переменные внутри стека существуют только до тех пор, пока работает метод, создавший их.
  • Он автоматически выделяется и освобождается, когда метод завершает выполнение.
  • Каждый рекурсивный вызов метода также создает новый кадр стека.
  • Если эта память заполнена, Java выдает java.lang.StackOverFlowError.
  • Доступ к этой памяти происходит быстрее по сравнению с кучей.
  • Эта память является потокобезопасной, поскольку каждый поток работает в своем собственном стеке.