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

Управление памятью в Java

Оглавление Введение Что такое переменные? Управление памятью в Java Заключение… С пометкой java, новички, область применения.

  • Вступление
  • Что такое переменные?
  • Управление памятью в Java
  • Вывод

Вступление

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

Что такое переменные?

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

Языки программирования делят типы данных на две группы: примитивные типы и ссылочные типы.

Примитивные типы

1 байт байт Хранит целые числа от -128 до 127
2 байта короткий Хранит целые числа от -32 768 до 32 767
4 байта в Хранит целые числа от -2,147,483,648 до 2,147,483,647
8 байт длинный Хранит целые числа от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807
4 байта плыть Хранит дробные числа. Достаточно для хранения от 6 до 7 десятичных цифр
8 байт двойной Хранит дробные числа. Достаточно для хранения 15 десятичных цифр
1 бит логический Сохраняет значения true или false
2 байта обуглить Хранит значения из одного символа / буквы или ASCII

Источник: Типы данных Java

Ссылочные типы

Это массивы, строки, классы, интерфейсы и т.д.

public Class Person {
private String firstName;
private String lastName;

public Person (String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}

// Getters and Setters
}
Array in Java: 
String[] cars = {"Volvo", "BMW", "Ford", "Mazda"};

Между этими двумя понятиями существуют серьезные различия. Но разница, представляющая интерес в этой статье, заключается в их хранении в памяти.

Управление памятью в Java

Управление памятью – это процесс выделения и освобождения памяти в Java. Виртуальная машина Java (JVM) обрабатывает этот процесс. Java использует автоматическую систему управления памятью, называемую сборщиком мусора. Пользователям языка очень редко приходится выполнять это действие самостоятельно. Хотя в системном классе есть статический метод gc() для запроса, чтобы JVM запустила сборщик мусора.

Память в java разделена на две: Стек и память кучи. Если вы знакомы со структурами данных, то вы слышали о стеках. Стеки – это динамические структуры данных, которые следуют парадигме “Последний вход – первый выход” (LIFO). Последний элемент, который будет вставлен в стек, является первым, который будет удален из него, пространство памяти стека следует этому принципу. Нет никакой связи между структурой данных кучи и пространством памяти кучи. Куча – это большее из двух пространств памяти в Java. Это большое пространство памяти, содержащее значения объектов, созданных в программе.

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

public class Test {
    public static void main(String[] args) {
        int intValue = 5;
        System.out.println(incrementInt(intValue));
        System.out.println(intValue);
    }

    public static int incrementInt (int intValue){
        intValue = intValue * 5;
        return intValue;
    }
}

Значение значение int остается 5. Это происходит потому, что переменные, определенные в методе, имеют область действия на уровне метода (т.е. Они существуют только в методе) и не могут быть доступны вне блока метода. Создается копия intValue и передается в метод incrementing . Когда программа входит в блок метода increment Int , увеличивается именно эта копия, и при выходе из блока метода переменная value извлекается из стека и отбрасывается. Память стека имеет определенный размер. Неэффективный код, такой как функция, вызывающая саму себя бесконечно (бесконечная рекурсия), может привести к переполнению стека – ситуации, когда в стеке заканчивается память.

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

Создание экземпляра класса Person, определенного ранее, и передача его через несколько блоков кода

public class Test {
    public static void main(String[] args) {
      Person newPerson = new Person("Nana", "Hawau");
      changeFirstName(newPerson);
      System.out.println(user.getFirstName())
    }

    public static void changeFirstName (User user){
        user.setFirstName("Ali");
    }
}

Переменная new Person хранится в памяти стека как ссылка на значение объекта в памяти кучи. В этом случае создается копия ссылки в стеке и указывается на значение объекта в куче. Поэтому, когда программа вводит метод change First Name , созданная новая ссылка указывает на тот же объект в куче. Любое изменение, внесенное в объект, затронет все экземпляры объекта в нескольких блоках кода. Программа печатает Ali в данном случае. Ссылочные типы данных собираются в мусор только тогда, когда ссылка на них больше не существует в стеке.

Вывод

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

Оригинал: “https://dev.to/nanahawau/memory-management-in-java-55l7”