Рубрики
Без рубрики

Понимание распределения памяти Java: стек против Куча

Стек Java Стек Java – это часть памяти вашего компьютера, в которой хранятся временные переменные… Помеченный java, стеком, кучей, структурами данных.

Стек Java

Стек Java – это часть памяти вашего компьютера, в которой хранятся временные переменные, созданные всеми выполняемыми вами функциями. Он используется для запуска потока и может включать как краткосрочные значения, так и ссылки на другие объекты. В нем работает ЛИФО (последний вход, первый выход) структура данных.

Когда вызывается метод, для этого метода создается новый блок в стеке. Все локальные значения и указатели на другие объекты, используемые процессом, будут сохранены в новом блоке. По завершении процедуры новый блок стирается и становится доступным для следующего метода. То, что вы здесь обнаружите, полезно исключительно для этой функции и не будет длиться дольше.

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

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

Пример того, как создать объект стека, выглядит следующим образом:

void somefunction( )
{
    /* create an object "m" of class Member
    this will be put on the stack since the
    "new" keyword is not used, and we are
    creating the object inside a function
    */

    Member m;

} //the object "m" is destroyed once the function ends

Куча Java

Куча – это место, где хранятся объекты Java. Он формируется при выполнении программы, и его размер может изменяться по мере выполнения программы. Его легко заполнить, и когда это произойдет, начнется сбор мусора. Объекты, которые больше не используются, удаляются, чтобы освободить место для новых.

В отличие от стека Java , где память выделяется при компиляции программы,/| Куча выделяет память во время выполнения программы. В отличие от прямого и быстрого доступа к стеку, доступ к переменным, хранящимся здесь, немного медленнее.

Глобальный пул памяти аналогичен куче. Если вам нужно, чтобы данные или переменные жили дольше, чем рассматриваемый метод или функция, куча будет использоваться для выделения памяти. Все функции доступны с помощью элементов, найденных здесь.

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

Молодое пространство (или детская комната) и старое пространство – это две подзоны. Выделение памяти для новых объектов обычно выполняется в молодом пространстве. Сбор мусора происходит, когда свободное пространство заполнено. Молодежное пространство часто используется краткосрочными или преходящими вещами. По сравнению с кучей без разделений, эта помощь ускоряет сбор мусора.

Пример того, как создать элемент в куче, выглядит следующим образом:

void somefunction( )
{
    /* create an object "m" of class Member
      this will be put on the heap since the 
      "new" keyword is used, and we are 
      creating the object inside a function
    */

    Member* m = new Member( );

    /* the object "m" must be deleted
      otherwise a memory leak occurs
    */

    delete m; 
} 

Сходства и различия стека и кучи

Оба этих метода используются Java для выделения памяти, и оба хранятся в оперативной памяти. Чтобы упростить задачу, куча используется для динамического выделения памяти, а стек используется для выделения статической памяти.

Где он хранится? К переменным, размещенным в стеке, можно получить доступ непосредственно из памяти, что позволяет им работать очень быстро. С другой стороны, доступ к объектам в куче занимает больше времени.

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

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

в двух словах…

Стек:

Поскольку методы и функции добавляют и уничтожают локальные переменные по мере необходимости, размер стека будет меняться. Без необходимости контролировать распределение памяти память выделяется, а затем освобождается. Размер стека ограничен, и он варьируется в зависимости от операционной системы. Переменные, хранящиеся в стеке, остаются действительными до тех пор, пока функция, которая их создала, активна.

Куча:

Память не управляется автоматически, и центральный процессор не обрабатывает ее так тщательно, как стек. Когда эти блоки больше не требуются, вы должны самостоятельно очистить выделенную оперативную память. Утечки памяти часто встречаются в кучах, где память выделяется бесполезным объектам и недоступна для других процессов. Куча не имеет ограничений по размеру. Доступ к объектам в куче намного медленнее, чем к объектам в стеке. Кроме того, запись в память кучи происходит медленнее.

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

Когда вы используете “Стек”?

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

Когда вы используете “Кучу”?

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

Наконец, я хотел бы заявить, что

Java выделяет память двумя способами: стеком и кучей. Когда у вас есть переменные, требующие глобального доступа, куча – это путь, в то время как стек – это путь для локальных переменных, которым требуется ограниченный объем памяти. Когда дело доходит до написания лучших приложений Java, знание того, когда и как использовать стек и кучу, имеет решающее значение.

При работе с утечками памяти также полезно понимать, как работает распределение памяти.

Оригинал: “https://dev.to/udaykiran137/understanding-java-memory-allocation-stack-vs-heap-1fm6”