Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Когда типичное приложение Java работает, оно создает новые объекты, такие как String и 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 был создан недостижимым - и это "мусор", который собирает мусор.

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

Подробнее см. запись в wikipedia Сбор мусора и Tuning Garbage Collection (от Oracle)

Ответ 3

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

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


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

Java-объекты создаются в Heap, а Heap делится на три части или поколения для сбора мусора на Java, они называются Young (New) поколение, Tenured (Old) Generation и Пермская область кучи.

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

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

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

Подробнее см. здесь: Сбор мусора


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

В java.lang.System

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

В java.lang.Runtime

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

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

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

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

  • Отметить фазу
  • Фаза развертки

читайте здесь для более подробной информации - Mark and Sweep Algorithm

Ответ 4

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

Ответ 5

Сборщик мусора является частью JRE, который гарантирует, что объект, на который не ссылаются, будет освобожден из памяти.
Обычно он запускается, когда у приложения заканчивается память. AFAIK содержит граф, который представляет связи между объектами и изолированными объектами. Чтобы сохранить производительность, текущие объекты, сгруппированные в поколения, каждый раз, когда GC сканирует объект и обнаруживает, что он по-прежнему ссылается на счетчик генерации, увеличенный на 1 (до некоторого максимального максимального значения, 3 или 4, я думаю), и новое поколение сначала сканируется (самый короткий объект в памяти, скорее всего, он больше не нужен), поэтому не все объекты проверяются каждый раз, когда выполняется GC.
прочитайте этот для получения дополнительной информации.

Ответ 6

Сборщик мусора позволяет вашему компьютеру моделировать компьютер с бесконечной памятью. Остальное - это просто механизм.

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

EDIT: Да, ссылка для С#, но С# и Java идентичны в этом отношении.

Ответ 7

Многие думают, что сбор мусора собирает и уничтожает мертвые объекты.
На самом деле сборка мусора Java делает все наоборот! Живые объекты отслеживаются, а все остальное - мусором.

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

Проверьте это для получения более подробной информации: http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx

Ответ 8

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

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

В отличие от С++ нет явной необходимости уничтожать объект. введите описание изображения здесь

Управление памятью - одна из самых важных работ для любого программирования язык. Учитывая приложение, которое считывает набор данных и чем напишите его в базу данных, для этого он будет использовать некоторое промежуточное хранилище где он будет хранить данные, прежде чем вставлять их в база данных. Теперь, если это место промежуточной памяти не очищено от предыдущие данные могут привести к его истощению, что приложение вниз. Чтобы предотвратить возникновение такого случая, может быть двумя способами: один, очистить память вручную, как на С++ или C, иначе, использовать фоновый процесс сбора мусора для выполнения этой работы автоматически.

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

http://www.studytonight.com/java/garbage-collection.php

http://beginnersbook.com/2013/04/java-garbage-collection/

Ответ 9

Сбор мусора на Java (и другие языки/платформы) - это способ для среды java run-time (JRE) повторно использовать память из объектов Java, которые больше не нужны. Упрощенно, когда JRE изначально запускается, он запрашивает операционную систему (O/S) для определенного объема памяти. Поскольку JRE запускает ваше приложение (приложения), оно использует эту память. Когда ваше приложение выполняется с использованием этой памяти, JRE "Garbage Collector" приходит и восстанавливает эту память для использования различными частями вашего существующего приложения (приложений). JRE "Сборщик мусора" - это фоновая задача, которая всегда работает, и пытается выбрать время, когда система не работает, чтобы продолжать свои мусорные трассы.

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

Ответ 10

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

Вызов сборщика мусора контролируется политиками сбора мусора.

Здесь вы можете получить некоторые данные. http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

Ответ 11

Сборщик мусора является компонентом jvm.

Используется для сбора мусора, когда когда-либо процессор становится свободным.

Здесь мусор означает неиспользуемые объекты, которые он запускает в Background of main program

для контроля состояния основной программы.

Ответ 12

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

В языке программирования, таком как C, выделение и освобождение памяти - это ручной процесс. В Java процесс освобождения памяти автоматически обрабатывается сборщиком мусора. Пожалуйста, проверьте ссылку для лучшего понимания. http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

Ответ 13

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

Ответ 14

Основными принципами сбора мусора являются поиск объектов данных в программе, к которым невозможно получить доступ в будущем, и для восстановления ресурсов, используемых этими объектами. https://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29

<сильные > Преимущества

1) Сохраняет от ошибок, которые возникают, когда часть памяти освобождается, пока есть еще указатели на нее, и один из этих указателей разыменовывается. https://en.wikipedia.org/wiki/Dangling_pointer

2) Двойные бесплатные ошибки, возникающие, когда программа пытается освободить область памяти, которая уже была освобождена и, возможно, уже выделена снова.

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

Недостатки

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

2) Момент, когда сбор мусора фактически собирается, может быть непредсказуемым, что приводит к остановке (паузы в смещение/свободная память), разбросанные по всему сеансу. Непредсказуемые киоски могут быть неприемлемыми в средах реального времени, в обработке транзакций или в интерактивных программах.


Учебник Oracle http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

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

В языках программирования, таких как C, С++, выделение и освобождение памяти - это ручной процесс.

int * array = new int[size];
processArray(array); //do some work.
delete array; //Free memory

Первый шаг процесса называется маркировкой. Здесь сборщик мусора идентифицирует, какие части памяти используются, а какие нет.

Шаг 2a. Обычное удаление удаляет объекты без ссылок, оставляя ссылки на объекты и указатели на свободное пространство.

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

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

Продолжайте читать этот учебник, и вы узнаете, как GC выполняет эту задачу.

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

Ответ 15

Поскольку объекты динамически распределяются оператором new, вы можете спросить, как эти объекты уничтожаются и как освобождается занятая память. В других языках, таких как C++, вам необходимо динамически освобождать объекты, выделенные вручную, с помощью оператора удаления. У Java другой подход; он автоматически обрабатывает освобождение. Техника известна как сборка мусора.

Это работает так: когда нет ссылок на объект, предполагается, что этот объект больше не нужен, и вы можете извлечь память, занятую объектом. Нет необходимости явно уничтожать объекты, как в C++. Сборка мусора происходит спорадически во время выполнения программы; Это не просто потому, что есть один или несколько объектов, которые больше не используются. Кроме того, несколько реализаций Java имеют разные подходы к сбору мусора, но большинству программистов не нужно беспокоиться об этом при написании программ.

Ответ 16

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

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


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

Java-объекты создаются в Heap, а Heap делится на три части или поколения для сбора мусора на Java, они называются Young (New) поколение, Tenured (Old) Generation и Пермская область кучи.

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

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

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

Ответ 17

Проще говоря, это могут быть самые простые термины, понятные даже непрограммисту: когда программа обрабатывает данные, она создает промежуточные данные и пространство для хранения (переменные, массивы, определенные метаданные объекта и т.д.) Для этих данных.

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

В Интернете есть несколько очень хороших статей о том, как это работает, поэтому я просто расскажу об очень простом определении.

GC - это в основном функция, которая выполняет эту очистку. Для этого очищаются записи таблицы, на которые не ссылаются никакие активные объекты, эффективно удаляются объекты, затем копируется и сжимается память. Это немного сложнее, чем это, но вы поняли идею.

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

Ответ 18

Автоматическая сборка мусора - это процесс, при котором JVM избавляется или удерживает определенные точки данных в памяти, чтобы в конечном счете освободить место для текущей программы. Память сначала отправляется в кучу памяти, то есть там, где сборщик мусора (GC) выполняет свою работу, тогда решено прекратить или сохранить. Java предполагает, что программисту не всегда можно доверять, поэтому он завершает элементы, которые, по его мнению, не нужны.