Что такое сборщик мусора в Java? - PullRequest
99 голосов
/ 26 сентября 2010

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

Ответы [ 16 ]

115 голосов
/ 26 сентября 2010

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

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

18 голосов
/ 26 сентября 2010

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

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)

13 голосов
/ 10 июля 2017

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

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


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

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

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

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

Heap Generations for Garbage Collection

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


Вы не можете заставить 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. Фаза развертки

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

6 голосов
/ 26 сентября 2010

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

6 голосов
/ 26 сентября 2010

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

3 голосов
/ 05 сентября 2014

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

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

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

3 голосов
/ 26 сентября 2010

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

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

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

1 голос
/ 04 августа 2018

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

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

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

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

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

0 голосов
/ 02 июля 2017

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

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

0 голосов
/ 23 июня 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...