freeCodeCamp/guide/russian/java/garbage-collection/index.md

7.6 KiB
Raw Blame History

title localeTitle
Garbage Collection Вывоз мусора

Коллекция мусора в Java

В таких языках, как C / C ++, разработчик обязан создавать и уничтожать объекты. Но если программист не выполняет свой долг, достаточная память может быть недоступна для создания нового объекта, и программа может закончиться вызовом OutOfMemoryErrors .

Java освобождает программиста от задачи управления памятью и сама восстанавливает память, занятую объектами, которые больше не используются. Сбор мусора в java осуществляется демонами, называемыми сборщиком мусора . JVM (виртуальная машина 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. Остров изоляции

Способы обращения к JVM для запуска сборщика мусора 1

  • Хотя создание объекта, имеющего право на сбор мусора, зависит от единственного усмотрения JVM, чтобы запустить сборщик мусора, чтобы его уничтожить.
  • Мы также можем запросить JVM для запуска сборщика мусора. Это можно сделать двумя способами:
  1. Использование метода System.gc () : системный класс содержит статический метод gc () для запроса JVM для запуска сборщика мусора.
  2. Использование метода Runtime.getRuntime (). Gc () : класс Runtime позволяет приложению взаимодействовать с JVM, в котором работает приложение. Следовательно, используя свой метод gc (), мы можем запросить JVM для запуска Collector мусора.
         // 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); 
    } 
 } 
  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 со следующим прототипом.
    protected void finalize() throws Throwable 

ПРИМЕЧАНИЕ 1 :

  1. Метод finalize (), вызываемый сборщиком мусора, а не JVM. Хотя Garbage Collector является одним из модулей JVM.
  2. Метод finalize () класса объекта имеет пустую реализацию, поэтому рекомендуется переопределить метод finalize () для утилизации системных ресурсов или для выполнения другой очистки.
  3. Метод finalize () никогда не вызывается более одного раза для любого заданного объекта.
  4. Если исключенное исключение выбрано методом finalize (), исключение игнорируется и завершается завершение этого объекта.

ИСТОЧНИКИ

  1. geeksforgeeks. Доступ: 24 октября 2017 года.