Что такое распределение памяти в Java? Стек и куча памяти



Эта статья, основанная на «Распределении памяти в Java», поможет вам получить подробные сведения о распределении памяти вместе со структурами данных стека и кучи.

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

Что такое стековая память?

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





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

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



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

Ключевые особенности стековой памяти

Помимо того, что мы обсуждали до сих пор, ниже приведены некоторые другие особенности Стек объем памяти:

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

Методы в классе Stack

  • Нажатие объекта ( Элемент объекта ): Помещает элемент на вершину стека.
  • Объект pop (): Удаляет и возвращает верхний элемент стека. An ‘EmptyStackException’ исключение выдается, если мы вызываем pop (), когда вызывающий стек пуст.
  • Обзор объекта (): Возвращает элемент на вершине стека, но не удаляет его.
  • Логическое значение empty (): Он возвращает истину, если на вершине стека ничего нет. В противном случае возвращает false.
  • int search ( Элемент объекта ): Он определяет, существует ли объект в стеке. Если элемент найден, он возвращает позицию элемента сверху стека.. В противном случае возвращается -1.

Код Java для реализации стека

import java.io. * import java.util. * class Test {static void stack_push (Stack stack) {for (int i = 0 i<5 i++){ stack.push(i) } } static void stack_pop(Stack stack){ System.out.println('Pop :') for(int i = 0 i < 5 i++){ Integer y = (Integer) stack.pop() System.out.println(y) } } static void stack_peek(Stack stack){ Integer element = (Integer) stack.peek() System.out.println('Element on stack top : ' + element) } static void stack_search(Stack stack, int element){ Integer pos = (Integer) stack.search(element) if(pos == -1) System.out.println('Element not found') else System.out.println('Element is found at position ' + pos) } public static void main (String[] args){ Stack stack = new Stack() stack_push(stack) stack_pop(stack) stack_push(stack) stack_peek(stack) stack_search(stack, 2) stack_search(stack, 6) } } 

//Вывод



memory-allocation-in-java

Теперь перейдем в пространство кучи.

Пространство кучи в Java

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

Ключевые особенности Java Heap Memory

  • Помимо того, что мы обсуждали до сих пор, ниже приведены некоторые другие особенности пространства кучи:
  • Доступ к нему осуществляется с помощью сложных методов управления памятью, которые включают Молодое поколение, старое или Заемное поколение, и Постоянное поколение
  • Если пространство кучи заполнено, Java выдает java.lang.OutOfMemoryError
  • Доступ к этой памяти относительно медленнее, чем к стековой памяти.
  • Эта память, в отличие от стека, не освобождается автоматически. Это нужно Уборщик мусора чтобы освободить неиспользуемые объекты, чтобы сохранить эффективность использования памяти
  • В отличие от стека, куча не потокобезопасный и его нужно охранять, правильно синхронизируя код

Разница между пространством кучи Java и памятью стека

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

  • Куча память используется всеми частями приложения, тогда как память стека используется только одним потоком выполнения.
  • Всякий раз, когда объект создается, он всегда сохраняется в пространстве кучи, а память стека содержит ссылку на него. Память стека содержит только локальные примитивные переменные и ссылочные переменные объектам в куче.
  • Объекты, хранящиеся в куче, доступны глобально, в то время как память стека не может быть доступна другим потокам.
  • Управление памятью в стеке осуществляется в LIFO в то время как в памяти кучи он более сложен, потому что используется глобально. Память кучи делится на Молодое поколение, старое поколение и т. д., подробнее см. Сборщик мусора Java.
  • Стековая память недолговечный тогда как память кучи живет от начала до конца выполнения приложения.
  • Мы можем использовать -XMX и -XMS Параметр JVM для определения размера запуска и максимального размера кучи. Мы можем использовать -XSS для определения размера памяти стека.
  • Когда память стека заполнена, среда выполнения Java выдает java.lang.StackOverFlowError тогда как если память кучи заполнена, она выдает java.lang.OutOfMemoryError: Пространство кучи Javaошибка.
  • Размер памяти стека намного меньше по сравнению с памятью кучи. Из-за простоты распределения памяти (ЛИФО), стековая память очень быстрая по сравнению скуча памяти.

Сравнительная таблица

ПАРАМЕТР СТЕК HEAP
Базовый Память выделяется в непрерывном блокеПамять распределяется в случайном порядке
Распределение и Распределение Автоматически компиляторомРуководство программиста
Стоимость МеньшеБольше
Реализация ЖесткийЛегко
Время доступа БыстрееПомедленнее
Главная проблема Нехватка памятиФрагментация памяти
Местность различия ОтличноАдекватный
Гибкость Фиксированная ставкаВозможно изменение размера

На этом мы подошли к концу этого руководства «Распределение памяти в Java». Я надеюсь, что вы поняли концепцию и ее реализацию на некоторых примерах в реальном времени.

Теперь, когда вы понялиРаспределение памяти в Javaосновы в этой статье «Распределение памяти в Java» ознакомьтесь с от Edureka, надежной компании по онлайн-обучению с сетью из более чем 250 000 довольных учащихся по всему миру. Курсы обучения и сертификации по Java J2EE и SOA от Edureka предназначены для студентов и профессионалов, которые хотят стать Java-разработчиками. Курс разработан, чтобы дать вам хорошее начало в программировании на Java и обучить вас как основным, так и продвинутым концепциям Java, а также различным фреймворкам Java, таким как Hibernate и весна .

Есть вопрос к нам? Упомяните об этом в разделе комментариев этого блога «Распределение памяти в Java», и мы свяжемся с вами как можно скорее.