Что такое сборщик мусора в Java?
Я новичок в Java и запутался в сборщике мусора в Java. Что он на самом деле делает и когда вступает в действие. Пожалуйста, опишите некоторые свойства сборщика мусора в Java.
Переведено автоматически
Ответ 1
Сборщик мусора - это программа, которая запускается на виртуальной машине Java и избавляется от объектов, которые больше не используются Java-приложением. Это форма автоматического управления памятью.
Когда запущено типичное Java-приложение, оно создает новые объекты, такие как String
s и File
s, но по истечении определенного времени эти объекты больше не используются. Например, взгляните на следующий код:
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, они называются молодым (Новым) поколением, постоянным (старым) поколением и постоянной областью кучи.
Новое поколение дополнительно разделено на три части, известные как Eden space, Survivor 1 и Survivor 2 space. Когда объект впервые создается в куче, он создается в новом поколении внутри Eden space, а после последующей незначительной сборки мусора, если объект выживает, он перемещается в survivor 1, а затем в survivor 2, прежде чем основная сборка мусора переместит этот объект в старое или штатное поколение.
Постоянное пространство кучи Java - это место, где JVM хранит метаданные о классах и методах, пуле строк и сведения об уровне класса.
Подробнее смотрите здесь : Сборка мусора
Вы не можете заставить JVM запустить сборку мусора, хотя вы можете сделать запрос, используя метод System.gc()
or Runtime.gc()
.
public static void gc() {
Runtime.getRuntime().gc();
}
public native void gc(); // note native method
Алгоритм разметки и развертки -
Это один из самых популярных алгоритмов, используемых при сборке мусора. Любой алгоритм сборки мусора должен выполнять 2 основные операции. Во-первых, он должен быть способен обнаруживать все недостижимые объекты, а во-вторых, он должен освободить пространство кучи, используемое объектами мусора, и снова сделать это пространство доступным для программы.
Вышеуказанные операции выполняются алгоритмом Mark и Sweep в два этапа:
- Отметить фазу
- Фаза очистки
подробнее читайте здесь - Алгоритм разметки и очистки
Ответ 4
сборщик мусора подразумевает, что объекты, которые больше не нужны программе, являются "мусором" и могут быть выброшены.