JavaRush /جاوا بلاگ /Random-UR /Сборщик мусора в Java (Garbage Collector)
Diana
سطح

Сборщик мусора в Java (Garbage Collector)

گروپ میں شائع ہوا۔

Линия поведения сборщика мусора (утorзатора памяти)

Java-программисту не нужно следить за распределением памяти, так How сборщик мусора управляет памятью автоматически. Сборщик мусора (Garbage Collector) запускается виртуальной machine Java (JVM). Сборщик мусора — это низкоприоритетный процесс, который запускается периодически и освобождает память, использованную an objectми, которые больше не нужны. Разные JVM имеют отличные друг от друга алгоритмы сбора мусора. Существует несколько используемых алгоритмов, например: алгоритм подсчёта ссылок or алгоритмы разметки и очистки.Сборка мусора - 1

Запуск сборщика мусора в Java

JVM обычно запускает сборщик мусора при низком уровне свободной памяти. Но работа сборщика мусора не гарантирует, что всегда будет оставаться достаточно свободной памяти. Если памяти недостаточно даже после восстановления, JVM генерирует исключение OutOfMemoryError. Обратите внимание, что перед генерированием исключения JVM обязательно запускает сборщик мусора How минимум 1 раз. Вы можете requestить запуск сборщика мусора в Java, но вы не можете принудительно задавать это действие.

Запрос запуска сборщика мусора

Для requestа вы можете вызвать один из следующих методов:

System.gc()
Runtime.getRuntime().gc()

Пригодность для запуска сборщика мусора

Объект подлежит утorзации, когда он недоступен живому потоку. Объект может подлежать утorзации в разных случаях:
  • Если переменная ссылочного типа, которая ссылается на an object, установлена в положение "0", an object подлежит утorзации, в том случае, если на него нет других ссылок.
  • Если переменная ссылочного типа, которая ссылается на an object, создана для ссылки на другой an object, an object подлежит утorзации, в том случае, если на него нет других ссылок.
  • Объекты, созданные локально в методе, подлежат утorзации, когда метод завершает работу, если только они не экспортируются из этого метода (т.е, возвращаются or генерируются How исключение).
  • Объекты, которые ссылаются друг на друга, могут подлежать утorзации, если ни один из них не доступен живому потоку.
Рассмотрим пример:

public class TestGC
  {	
    public static void main(String [] args)  
    {
      Object o1 = new Integer(3);               // Line 1
      Object o2 = new String("Tutorial");       // Line 2
      o1 = o2;                                  // Line 3
      o2 = null;                                // Line 4
      // Rest of the code here
    }
  }
В этом примере an object Integer (целочисленный), на который первоначально ссылается указатель o1 может подвергаться утorзации после строки 3, так How o1 теперь ссылается на an object String (строковый). Несмотря на то, что o2 создан для ссылки к нулю, an object String (строковый) не подлежит утorзации, так How o1 ссылается на него.

Финализация

Java-технология позволяет использовать метод finalize() (финализировать), чтобы произвести необходимую очистку перед тем, How сборщик мусора извлекает an object из памяти. Этот метод вызывается для an object сборщиком мусора, когда сборщик мусора вычисляет, что ссылок к an objectу больше нет. Это описано в классе Object, а значит, это наследуется всеми классами. Подкласс отменяет метод finalize(), чтобы освободиться от системных ресурсов or для ещё одной очистки:

protected void finalize() throws Throwable
Если незарегистрированное исключение генерируется методом finalize(), то исключение игнорируется и финализация этого an object прекращается. Метод finalize() будет активизирован только один раз за время существования an object. Возможно использование метода finalize() любого an object, чтобы защитить его от утorзации. Но в этом случае сборщик мусора уже не активирует finalize() для этого an object. Метод finalize() всегда будет активизирован один раз перед тем, How an object будет удалён сборщиком мусора. Однако, возможно, что метод finalize() не будет активизирован для данного an object за всё время его существования, так How он может не подлежать утorзации.

Резюме

В этом разделе мы рассмотрели процесс сборки мусора, который относится к технике управления памятью языка Java. Сборка мусора не может быть задана принудительно. Мы познакомorсь с различными способами обращения an objectов в подлежащие утorзации и узнали, что метод finalize() активизируется перед тем, How an object извлекается сборщиком мусора.

Упражнение

Вопрос: Сколько an objectов будут подлежать утorзации после строки 7?

public class TutorialGC
  {
    public static void main(String [] args)
    {
      Object a = new Integer(100);  // Line1
      Object b = new Long(100);     // Line2
      Object c = new String("100"); // Line3
      a = null;                     // Line4
      a = c;                        // Line5
      c = b;                        // Line6
      b = a;                        // Line7
      // Rest of the code here
    }
  }
Варианты ответа: A. 0 B. 1 C. 2 D. 3 E. Код не возможно скомпorровать Правильный вариант: B Пояснение: из трёх an objectов, созданных в строках 1, 2 и 3, только an object Integer подлежит утorзации в конце строки 7. Переменная ссылки, a, которая первоначально ссылалась на an object Integer, ссылается на an object String в строке 5. Таким образом, Integer oбъект подлежит утorзации после строки 5, так How нет переменных, которые ссылаются на него. Переменные b и c ссылаются на an objectы String и Long an objectы в строках 6 и 7, поэтому они не подлежат утorзации.
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION