108 lines
7.6 KiB
Markdown
108 lines
7.6 KiB
Markdown
|
---
|
|||
|
title: Garbage Collection
|
|||
|
localeTitle: Вывоз мусора
|
|||
|
---
|
|||
|
# Коллекция мусора в Java
|
|||
|
|
|||
|
В таких языках, как C / C ++, разработчик обязан создавать и уничтожать объекты. Но если программист не выполняет свой долг, достаточная память может быть недоступна для создания нового объекта, и программа может закончиться **вызовом OutOfMemoryErrors** .
|
|||
|
|
|||
|
Java освобождает программиста от задачи управления памятью и сама восстанавливает память, занятую объектами, которые больше не используются. Сбор мусора в java осуществляется демонами, называемыми **сборщиком мусора** . **JVM (виртуальная машина Java)** вызывает его, когда нехватка памяти (кучи) для новых объектов.
|
|||
|
|
|||
|
## Когда объект становится пригодным для сбора мусора?
|
|||
|
|
|||
|
* Объект становится подходящим для коллекции мусора, если он недоступен ни от каких живых потоков или от каких-либо статических ссылок.
|
|||
|
* Объект становится подходящим для коллекции мусора, если все ссылки являются нулевыми.
|
|||
|
|
|||
|
```java
|
|||
|
Integer n = new Integer();
|
|||
|
n = null; //the Integer object is no longer accessible
|
|||
|
```
|
|||
|
|
|||
|
* Циклические зависимости не считаются ссылкой, поэтому, если объект X имеет ссылку объекта Y, а объект Y имеет ссылку объекта X, и у них нет другой ссылки на живые ссылки, то оба объекта X и Y будут иметь право на сбор мусора.
|
|||
|
|
|||
|
## Как вручную сделать объект подходящим для коллекции мусора?
|
|||
|
|
|||
|
* Несмотря на то, что программист не уничтожает объекты, это хорошая практика программирования, чтобы сделать объект недоступным (таким образом, подходящим для GC) после его использования.
|
|||
|
* Как правило, существует четыре разных способа сделать объект подходящим для сбора мусора.
|
|||
|
|
|||
|
1. Обнуление ссылочной переменной
|
|||
|
2. Повторное присвоение ссылочной переменной
|
|||
|
3. Объект создается внутри блока, и ссылка выходит за пределы области действия после того, как управление выйдет из этого блока.
|
|||
|
4. [Остров изоляции](http://www.geeksforgeeks.org/island-of-isolation-in-java/)
|
|||
|
|
|||
|
## Способы обращения к JVM для запуска сборщика мусора 1
|
|||
|
|
|||
|
* Хотя создание объекта, имеющего право на сбор мусора, зависит от единственного усмотрения JVM, чтобы запустить сборщик мусора, чтобы его уничтожить.
|
|||
|
* Мы также можем запросить JVM для запуска сборщика мусора. Это можно сделать двумя способами:
|
|||
|
|
|||
|
1. Использование метода _**System.gc ()**_ : системный класс содержит статический метод gc () для запроса JVM для запуска сборщика мусора.
|
|||
|
2. Использование _**метода Runtime.getRuntime (). Gc ()**_ : класс Runtime позволяет приложению взаимодействовать с JVM, в котором работает приложение. Следовательно, используя свой метод gc (), мы можем запросить JVM для запуска Collector мусора.
|
|||
|
|
|||
|
```java
|
|||
|
// Java program to request
|
|||
|
// JVM to run Garbage Collector
|
|||
|
public class Test
|
|||
|
{
|
|||
|
public static void main(String[] args) throws InterruptedException
|
|||
|
{
|
|||
|
Test test1 = new Test();
|
|||
|
Test test2 = new Test();
|
|||
|
|
|||
|
// Nullifying the reference variable
|
|||
|
test1 = null;
|
|||
|
|
|||
|
// requesting JVM for running Garbage Collector
|
|||
|
System.gc();
|
|||
|
|
|||
|
// Nullifying the reference variable
|
|||
|
test2 = null;
|
|||
|
|
|||
|
// requesting JVM for running Garbage Collector
|
|||
|
Runtime.getRuntime().gc();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
// finalize method is a method which is called on object once
|
|||
|
// before garbage collector is destroying it and reclaiming its memory
|
|||
|
protected void finalize() throws Throwable
|
|||
|
{
|
|||
|
System.out.println("Garbage collector is called");
|
|||
|
System.out.println("Object garbage collected : " + this);
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```java
|
|||
|
OUTPUT -
|
|||
|
Garbage collector called
|
|||
|
Object garbage collected : Test@46d08f12
|
|||
|
Garbage collector called
|
|||
|
Object garbage collected : Test@481779b8
|
|||
|
```
|
|||
|
|
|||
|
Заметка :
|
|||
|
|
|||
|
1. Нет никакой гарантии, что любой из двух вышеперечисленных методов определенно будет запускать сборщик мусора.
|
|||
|
2. Вызов System.gc () фактически эквивалентен вызову: Runtime.getRuntime (). Gc ()
|
|||
|
|
|||
|
## Финализация объектов
|
|||
|
|
|||
|
* Объекты имеют ресурсы, связанные с ними. Это их обязанность освобождать ресурсы.
|
|||
|
* Finalize () объявляется в классе Object и вызывается сборщиком мусора один раз, перед уничтожением объекта. Объект может предпринять любое последнее действие, используя этот метод jst, прежде чем его область будет исправлена сборщиком мусора.
|
|||
|
* finalize () присутствует в классе Object со следующим прототипом.
|
|||
|
|
|||
|
```java
|
|||
|
protected void finalize() throws Throwable
|
|||
|
```
|
|||
|
|
|||
|
## ПРИМЕЧАНИЕ 1 :
|
|||
|
|
|||
|
1. Метод finalize (), вызываемый сборщиком мусора, а не JVM. Хотя Garbage Collector является одним из модулей JVM.
|
|||
|
2. Метод finalize () класса объекта имеет пустую реализацию, поэтому рекомендуется переопределить метод finalize () для утилизации системных ресурсов или для выполнения другой очистки.
|
|||
|
3. Метод finalize () никогда не вызывается более одного раза для любого заданного объекта.
|
|||
|
4. Если исключенное исключение выбрано методом finalize (), исключение игнорируется и завершается завершение этого объекта.
|
|||
|
|
|||
|
### ИСТОЧНИКИ
|
|||
|
|
|||
|
1. [geeksforgeeks.](http://www.geeksforgeeks.org/garbage-collection-java/) Доступ: 24 октября 2017 года.
|