Вопрос-ответ

What is the garbage collector in Java?

Что такое сборщик мусора в Java?

Я новичок в Java и запутался в сборщике мусора в Java. Что он на самом деле делает и когда вступает в действие. Пожалуйста, опишите некоторые свойства сборщика мусора в Java.

Переведено автоматически
Ответ 1

Сборщик мусора - это программа, которая запускается на виртуальной машине Java и избавляется от объектов, которые больше не используются Java-приложением. Это форма автоматического управления памятью.

Когда запущено типичное Java-приложение, оно создает новые объекты, такие как Strings и Files, но по истечении определенного времени эти объекты больше не используются. Например, взгляните на следующий код:

for (File f : files) {
String s = f.getName();
}

В приведенном выше коде String s создается на каждой итерации for цикла. Это означает, что на каждой итерации выделяется немного памяти для создания String объекта.

Возвращаясь к коду, мы можем видеть, что после выполнения одной итерации на следующей итерации String объект, который был создан на предыдущей итерации, больше не используется - этот объект теперь считается "мусором".

В конце концов, мы начнем получать много мусора, и память будет использоваться для объектов, которые больше не используются. Если это будет продолжаться, в конечном итоге виртуальной машине Java не хватит места для создания новых объектов.

Вот тут-то и вступает в дело сборщик мусора.

Сборщик мусора будет искать объекты, которые больше не используются, и избавляется от них, освобождая память, чтобы другие новые объекты могли использовать эту часть памяти.

В Java об управлении памятью заботится сборщик мусора, но в других языках, таких как C, необходимо выполнять управление памятью самостоятельно, используя такие функции, как malloc и free. Управление памятью - это одна из тех вещей, в которых легко допустить ошибки, которые могут привести к так называемым утечкам памяти - местам, где память не восстанавливается, когда они больше не используются.

Автоматические схемы управления памятью, такие как сборка мусора, позволяют программисту не так сильно беспокоиться о проблемах управления памятью, поэтому он или она может больше сосредоточиться на разработке приложений, которые им необходимо разработать.

Ответ 2

Он освобождает память, выделенную для объектов, которые больше не используются программой - отсюда и название "мусор". Например:

public static Object otherMethod(Object obj) {
return new Object();
}

public static void main(String[] args) {
Object myObj = new Object();
myObj = otherMethod(myObj);
// ... more code ...
}

Я знаю, что это чрезвычайно надуманно, но здесь после вызова otherMethod() оригинал Object created становится недоступным - и это "мусор", который собирается мусором.

В Java GC запускается автоматически, но вы также можете вызвать его явно с помощью System.gc() и попытаться принудительно выполнить крупную сборку мусора. Как указывает Pascal Thivent, вы действительно не должны этого делать, и это может принести больше вреда, чем пользы (см. Этот вопрос).

Подробнее смотрите статью в Википедии о сборке мусора и настройке сборки мусора (от Oracle)

Ответ 3

Объект становится пригодным для сборки мусора или GC, если он недоступен ни из каких живых потоков или по каким-либо статическим ссылкам.

Другими словами, вы можете сказать, что объект становится пригодным для сборки мусора, если все его ссылки равны null. Циклические зависимости не учитываются как ссылка, поэтому, если объект A имеет ссылку на объект B, а объект B имеет ссылку на объект A, и у них нет никакой другой действующей ссылки, то оба объекта A и B будут иметь право на сборку мусора.


Поколения кучи для сборки мусора -

Объекты Java создаются в Heap и Heap разделяются на три части или поколения для сбора мусора в Java, они называются молодым (Новым) поколением, постоянным (старым) поколением и постоянной областью кучи.

Пространство кучи Java
Новое поколение дополнительно разделено на три части, известные как Eden space, Survivor 1 и Survivor 2 space. Когда объект впервые создается в куче, он создается в новом поколении внутри Eden space, а после последующей незначительной сборки мусора, если объект выживает, он перемещается в survivor 1, а затем в survivor 2, прежде чем основная сборка мусора переместит этот объект в старое или штатное поколение.

Постоянное пространство кучи Java - это место, где JVM хранит метаданные о классах и методах, пуле строк и сведения об уровне класса.

Поколения кучи для сборки мусора

Подробнее смотрите здесь : Сборка мусора


Вы не можете заставить JVM запустить сборку мусора, хотя вы можете сделать запрос, используя метод System.gc() or Runtime.gc().

В Java.lang.System

public static void gc() {
Runtime.getRuntime().gc();
}

В java.lang.Runtime

public native void gc();  // note native  method

Алгоритм разметки и развертки -

Это один из самых популярных алгоритмов, используемых при сборке мусора. Любой алгоритм сборки мусора должен выполнять 2 основные операции. Во-первых, он должен быть способен обнаруживать все недостижимые объекты, а во-вторых, он должен освободить пространство кучи, используемое объектами мусора, и снова сделать это пространство доступным для программы.

Вышеуказанные операции выполняются алгоритмом Mark и Sweep в два этапа:


  1. Отметить фазу

  2. Фаза очистки

подробнее читайте здесь - Алгоритм разметки и очистки

Ответ 4

сборщик мусора подразумевает, что объекты, которые больше не нужны программе, являются "мусором" и могут быть выброшены.

java