Что такое сборщик мусора в Java?
Я новичок в Java и запутался в сборщике мусора на Java. Что он на самом деле делает, и когда он вступает в действие. Опишите некоторые свойства сборщика мусора в Java.
- Полезный пример выключения в Java?
- Jar для Mac OSX App Bundle с приложением
- Сообщение maven "не может найти символ" бесполезно
- Как конвертировать MS doc в pdf
- java.rmi.ConnectException: подключение отказалось от хоста: 127.0.1.1;
- Как различные политики хранения влияют на мои annotations?
- Ошибка при проверке версии Java: не удалось найти java.dll
- Очистите ArrayList или просто создайте новый, и пусть старый будет собран мусором?
Сборщик мусора – это программа, которая запускается на виртуальной машине 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.
Новое поколение далее разделено на три части, известные как пространство Эдена, пространство для выживания 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 в два этапа:
- Отметка фазы
- Фаза развертки
читайте здесь для более подробной информации – Алгоритм 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.
Новое поколение далее разделено на три части, известные как пространство Эдена, пространство для выживания 1 и выжившего 2. Когда объект, созданный сначала в куче, его создается в новом поколении внутри пространства Эдена и после последующей мелкой сборки мусора, если объект выживает, его перемещают в выжившего 1, а затем выживают 2 до того, как основная assembly мусора перенесла этот объект на старое или поколение .
Пермское пространство Java Heap – это где JVM хранит метаданные о classах и методах, строковых пулах и деталях уровня.
Проще говоря, даже не программист может понять, когда программа обрабатывает данные, она создает промежуточные данные и пространство для хранения (переменные, массивы, определенные метаданные объектов и т. Д.) Для этих данных.
Когда эти объекты доступны через функции или по определенному размеру, они выделяются из центральной кучи. Тогда, когда они не нужны, их нужно очистить.
В Интернете есть несколько хороших статей о том, как это работает, поэтому я просто расскажу о самом базовом определении.
GC – это в основном функция, которая выполняет эту очистку. Для этого нужно очистить записи таблицы, на которые не ссылаются какие-либо активные объекты, эффективно удаляя объекты, а не копирует и уплотняет память. Это немного сложнее, чем это, но вы получаете эту идею.
Большая проблема заключается в некоторых деталях, которые этот процесс часто требует, чтобы вся виртуальная машина Java требовала, чтобы ее временно остановили, а также весь этот процесс, который очень интенсивен для процессора и памяти. Различные варианты GC и параметры настройки для каждого из них предназначены для сбалансирования этих различных проблем со всем процессом GC.
Автоматическая assembly мусора – это процесс, при котором JVM избавляется или сохраняет определенные точки данных в памяти, чтобы в конечном счете освободить место для текущей программы. Память сначала отправляется в кучу памяти, то есть там, где сборщик мусора (GC) выполняет свою работу, тогда решено прекратить или сохранить. Java предполагает, что программисту не всегда можно доверять, поэтому он завершает элементы, которые, по его мнению, не нужны.