- Вступление
- Что такое переменные?
- Управление памятью в 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”