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

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

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

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

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

 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)

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

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


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

Объекты Java создаются в Heap а Heap разделяется на три части или поколения для сбора мусора на Java, они называются Young (New) поколения, Tenured (Old) Generation и Perm Area of the heap.

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

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

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

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


Вы не можете заставить JVM запускать Runtime.gc() мусора, хотя вы можете сделать запрос с использованием метода 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 в два этапа:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сборщик мусора является составной частью jvm.

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

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

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

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

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

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

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

преимущества

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

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

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

Недостатки

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

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


Учебник 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 

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

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

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

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

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

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

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

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

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

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


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

Объекты Java создаются в Heap а Heap разделяется на три части или поколения для сбора мусора на Java, они называются Young (New) поколения, Tenured (Old) Generation и Perm Area of the heap.

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

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

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

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

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

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

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

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

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

  • getClass (). getClassLoader () имеет значение null, почему?
  • Java2D Graphics сглаживает
  • Как добавить записи в существующий zip-файл в Java?
  • Почему Catch (Exception) почти всегда является плохой идеей?
  • Поведение статического метода в многопоточной среде в java
  • Какой спецификатор доступа по умолчанию в Java?
  • Java Generic List <Список >
  • com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи связи. Программное обеспечение вызвало прерывание соединения: recv failed
  • Вызывает ли клонирование clone () в массиве его содержимое?
  • Как найти кодировку по умолчанию или кодировку в Java?
  • Установите время до 00:00:00
  • Interesting Posts

    Слишком много дискового ввода-вывода в Windows

    Как сжать (/ zip) и распаковать (/ распаковать) файлы и папки с помощью пакетного файла без использования каких-либо внешних инструментов?

    WPF. Как я могу сосредоточить все элементы в WrapPanel?

    R Заseleniumные сетки долготы – широта сетки на карте

    Как я могу сжать файл в Linux на месте, не используя дополнительное дисковое пространство?

    Монитор (DVI-D) для ноутбука (VGA)

    Как изменить цвет фона ActionMode в Android

    Убить нить в библиотеке Pthread

    Фильтр Tomcat CORS

    Функция тайм-аута

    Перечисления Java: два типа перечислений, каждый из которых содержит ссылки друг на друга?

    Скопировать файл на удаленный компьютер с помощью удаленных учетных данных администратора

    Бесплатный способ обмена большими файлами (50 МБ) через Интернет?

    Java: определение терминов инициализация, декларация и присвоение

    XMLHttpRequest не может загрузить XXX Нет заголовка «Access-Control-Allow-Origin»

    Давайте будем гением компьютера.