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

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

16 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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() и попытаться форсировать крупную сборку мусора. Как указывает Паскаль Тивент, вам действительно не нужно этого делать, и это может принести больше вреда, чем пользы (см. Этот вопрос).

Для получения дополнительной информации см. Статью в Википедии о сборке мусора и настройке сбора мусора (из Oracle).

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

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


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

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

Java Heap Space Новое поколение далее делится на три части, известные как пространство Eden, Survivor 1 и Survivor 2. Когда объект, впервые созданный в куче, создается в новом поколении внутри пространства Eden и после последующей незначительной сборки мусора, если объект выживает, его перемещают в оставшийся в живых 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

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

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

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

  1. Отметить фазу
  2. Фаза развертки

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

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: Да, ссылка для C#, но C# и Java в этом отношении идентичны.

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

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

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

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

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

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

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

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

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

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

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

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

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

Здесь мусор означает неиспользуемые объекты, которые он запускает в фоновом режиме основной программы.

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

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

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

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

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


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

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

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

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

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

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

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

Основными принципами сборки мусора являются поиск объектов данных в программе, к которым нет доступа в будущем, и восстановление ресурсов, используемых этими объектами. 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, C++, выделение и освобождение памяти выполняется вручную.

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

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

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

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

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

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

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

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

Другие вопросы по тегам