Сборка мусора означает уничтожение или удаление неиспользуемых объектов в памяти. Объекты, которые не используются или на которые нет ссылок, могут быть восстановлены.
Сборщик мусора используется для автоматического восстановления неиспользуемой памяти. Java обрабатывает освобождение памяти автоматически, так как объект, однажды созданный, использует некоторую память в расположении кучи.
Как это работает?
До появления java самым популярным языком программирования был либо C, либо C++. Так что, если вы знаете эти языки, вы бы знали, что вы должны управлять своей собственной памятью на этих языках.
Например, в C у вас есть методы , такие как calloc(), malloc() и realloc(), которые позволят вам использовать буферную память.
Вы должны указать, сколько памяти вам нужно для вашей программы, и сказать это в этих вызовах API, а затем можете получить буфер памяти для выполнения чего-то вроде создания узла связанного списка или чего-то в этом роде.
Но в конце вашей программы, в какой-то логический момент, вы также несете ответственность за освобождение этой памяти.
Итак, давайте представим себе большое приложение, написанное на языке C, которое продолжает выделять буферную память, а иногда забывает освободить память, и в конечном итоге это приведет к утечкам памяти и множеству проблем в приложении.
Также в C++ вы бы использовали конструкторы , такие как new и деструкторы, для освобождения ресурсов.
Так что это некоторые вещи, о которых программистам приходилось заботиться или беспокоиться всякий раз, когда они внедряли эти вещи на таких языках, как C и C++.
Но java поставляется с автоматическим управлением памятью через поток, называемый сборщиком мусора, и его основная цель – освободить память кучи путем уничтожения недоступных объектов.
Сборщик мусора – это один из потоков демона, который всегда работает в фоновом режиме.
Что такое недоступные объекты в java?
Когда объект становится пригодным для сбора мусора? Недоступные объекты – это те объекты, на которые нет живых ссылок. Давайте посмотрим на пример,
общедоступная статическая пустая основная(строка[] аргументов) { //Объект StringBuffer sb не подходит для сборки мусора Буфер строк Буфер строк (“Цветочные скобки”); Система.выход.печать(sb) ; //Объект StringBuffer sb имеет право на сборку мусора ; }
В основном методе я создал объект StringBuffer и его ссылку. Я собираюсь напечатать этот объект StringBuffer.
На этом этапе объект StringBuffer не подходит для сборки мусора. Теперь я собираюсь присвоить значение “null” объекту StringBuffer.
В этом случае объект StringBuffer подходит для сборки мусора и становится недоступным объектом в куче памяти.
Таким образом, это в основном работает на паре гипотез, которые заключаются в том, что большинство объектов вскоре становятся недоступными. Это означает, что объекты обычно создаются в контексте “блока if” или метода.
Таким образом, большинство объектов создаются таким образом для написания вашего кода, и эти объекты выходят за рамки, как только выполнение метода завершено, они могут быть собраны в мусор.
Далее идут ссылки со старых объектов на новые объекты, существующие только в небольшом количестве. Это означает, что объекты, которые долгое время находятся в вашем приложении, обычно не относятся к вновь созданным объектам.
Вот пара терминов, с которыми мы должны быть знакомы; один из них – “живой” объект. Живой объект – это объект в вашем приложении, на который ссылается другой объект в вашем приложении.
Другой – “мертвый” объект. Мертвый объект – это недоступный объект, который создается во время вызова метода, и как только вызов метода завершен, объект вырван из контекста и просто лежит в куче.
Когда объект имеет право на сборку мусора?
Если у объекта нет какой-либо ссылочной переменной, объект имеет право на сборку мусора.
Как сделать объект пригодным для сбора мусора?
Ниже приведено несколько способов,
нулевая ссылочная переменная Студент Студент() ; ;
переназначить ссылочную переменную Студент Студент(); Студент Студент(); ;
создать анонимный объект новый ученик(); После предоставления объекту права на сборку мусора объект не уничтожается немедленно сборщиком мусора.
Также читайте — предисловие к виртуальной машине java и архитектуре
Но когда виртуальная машина java запускает сборщик мусора, уничтожается только объект.
ПРИМЕЧАНИЕ: сборщик мусора собирает только объекты, созданные с использованием ключевого слова “новый”, а для объектов без ключевого слова “новый” используйте метод finalize().
Существует два метода для запроса виртуальной машины java для запуска сборщика мусора. Они являются,
- Метод System.gc()
- завершить() метод
- Метод Runtime.getRuntime().gc()
Статический метод gc() находится в системном классе. Этот метод запрашивает JVM для вызова сборщика мусора. Давайте посмотрим java-программу на метод gc(), вызывающий сборщик мусора.
сборщик мусора общего класса { общедоступная статическая пустая основная(строка[] аргументов) { Сотрудник Сотрудник(); Сотрудник Сотрудник(); ; ; System.gc(); } завершение публичной недействительности() { System.out.println(“объект, собранный в мусор”); } }
Выход:
объект мусор собранный объект мусор собранный
метод finalize() вызывается непосредственно перед уничтожением объекта. Этот метод определен в классе объектов:
защищенный void finalize() выбрасывает выбрасываемый
- Метод Finalize используется для закрытия подключения к базе данных.
- Этот метод вызывается сборщиком мусора, а не JVM.
- Мы должны переопределить метод finalize(). Потому что у него пустая реализация.
- Он вызывается только один раз для каждого объекта.
getRuntime().gc() метод присутствует в классе времени выполнения. Метод getRuntime().gc() возвращает объект среды выполнения, связанный с текущим приложением Java. Давайте посмотрим java-программу на метод getRuntime().gc() .
демонстрация публичного класса { общедоступная статическая пустая основная(строка[] аргументов) { Демонстрационная демонстрация(); Демонстрационная демонстрация(); //обнуляющая ссылочная переменная ; //обнуляющая ссылочная переменная ; //запущенный сборщик Мусора Время выполнения.getRuntime().gc(); } @Переопределение защищенный void finalize() выбрасывает выбрасываемый { System.out.println(“Вызван сборщик мусора”); System.out.println(“Сборщик мусора объекта: ” + это); } }
Вывод: Вызван сборщик мусора Сборщик мусора объекта: Демонстрация @2130772 Вызван сборщик мусора Сборщик мусора объекта: Демонстрация @cd4e940
Преимущества сбора мусора:
- Сборка мусора в java происходит автоматически, так как java освобождает вас от дополнительного бремени освобождения используемой памяти. Следовательно, повышение эффективности памяти Java.
- Сборка мусора обеспечивает целостность программы.
- Нам не нужно писать дополнительный код, так как сборщик мусора является частью JVM.
Оригинал: “https://dev.to/lohith/garbage-collection-in-java-how-it-works-and-advantages-of-garbage-collection-3ljb”