Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

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

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

Стек в Java — это раздел памяти, который содержит методы, локальные переменные и ссылочные переменные. Память стека всегда используется в порядке «последний пришел – первый обслужен». Локальные переменные создаются в стеке.

Что такое динамическая память?

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

Распределение памяти в Java

Распределение памяти в Java это процесс, в котором разделы виртуальной памяти выделяются в программе для хранения переменных и экземпляров структур и классов. Однако память не выделяется объекту при объявлении, а создается только ссылка. Для выделения памяти объекта используется метод new(), поэтому объекту всегда выделяется память в куче.

Распределение памяти Java разделено на следующие разделы:

  1. Куча
  2. Стопка
  3. Код
  4. Статический

Такое разделение памяти необходимо для ее эффективного управления.

Разница между локальной переменной и переменной экземпляра

Переменная экземпляра объявляется внутри класса, но не внутри метода

class Student{ 
int num; // num is  instance variable 
public void showData{}

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

public void sum(int a){

int x = int a +  3;

// a , x are local variables;

}

Разница между стеком и кучей

Нажмите здесь, если видео недоступно

Давайте рассмотрим пример, чтобы лучше понять это.

Учтите, что ваш основной метод вызывает метод m1

public void m1{
int x=20
}

В стеке java фрейм будет создан из метода m1.

Переменная X в m1 также будет создана во фрейме для m1 в стеке. (См. изображение ниже).

Метод m1 вызывает метод m2. В стеке java создается новый фрейм для m2 поверх фрейма m1.

Переменные b и c также будут созданы во фрейме m2 в стеке.

public void m2(int b){
boolean c;
}

Тот же метод m2 вызывает метод m3. Снова кадр m3 создается наверху стека (см. изображение ниже).

Теперь предположим, что наш метод m3 создает объект для класса «Учетная запись», который имеет две переменные экземпляра:int p и int q.

Account {
             Int p;
             Int q;
       }

Вот код метода m3

public void m3(){
	Account ref = new Account();
	// more code
}

Оператор new Account() создаст объект account в куче.

Ссылочная переменная «ref» будет создана в стеке java.

Оператор присваивания «=» создаст ссылочную переменную, указывающую на объект в куче.

Как только метод завершит свое выполнение. Поток управления вернется к вызывающему методу. В данном случае это метод m2.

Стек из метода m3 будет очищен.

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

Как только метод m2 завершит свое выполнение. Он будет удален из стека, а все его переменные будут сброшены и больше не будут доступны для использования.

Аналогично для метода m1.

В конце концов, поток управления вернется к начальной точке программы. Обычно это «основной» метод.

Что, если Object имеет ссылку в качестве переменной экземпляра?

public static void main(String args[]) {
  A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d;  //more code }

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

Обзор:


java

  1. Переменные и литералы Java
  2. Java-класс и объекты
  3. Абстрактный класс Java и абстрактные методы
  4. Вложенный и внутренний класс Java
  5. Java бросает и бросает
  6. Типы аннотаций Java
  7. Автоупаковка и распаковка Java
  8. Java String replace(), replaceAll() и replaceFirst()
  9. Java — переопределение
  10. Java 10 — выделение кучи