Сборщик мусора Java – Когда он собирает?

Что определяет, когда сборщик мусора действительно собирает? Это происходит через определенное время или после того, как определенный объем памяти исчерпан? Или есть другие факторы?

Он запускается, когда он определяет, что пришло время запуска. Общей страtagsей сборщиков мусора поколения является запуск коллектора при сбое памяти поколения 0. То есть каждый раз, когда вы выделяете небольшой блок памяти (большие блоки обычно помещаются непосредственно в «старые» поколения), система проверяет, достаточно ли свободного места в кучке gen-0, а если нет, то выполняется GC, чтобы освободить место для выделения для успеха. Затем старые данные переносятся в кучу gen-1, и когда пространство заканчивается там, GC запускает коллекцию на этом, обновляя данные, которые были дольше всего до кучи gen-2, и так далее. Таким образом, GC не просто «работает». Он может работать только в куче gen-0 (и большинство коллекций будет делать именно это), или он может проверять каждое поколение, если ему действительно нужно освободить много памяти (что необходимо только довольно редко).

Но это далеко не единственная страtagsя. Параметр GC работает в фоновом режиме, очищаясь во время работы программы. Некоторые GC могут работать как часть распределения памяти. Инкрементный коллектор может это сделать, сканируя несколько объектов при каждом распределении памяти.

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

Я считаю, что Suns JVM недавно получила GC для генерации (возможно, v1.6) Я не кодировал Java целую вечность, поэтому не уверен в этом, но я помню, что удивился не так давно, когда один из пунктов продажи для новая версия была «GC GC поколения». Не в последнюю очередь потому, что у .NET был один с первого дня).

Другие JVM, безусловно, могут выбрать любую страtagsю, которая им нравится.

EDIT: вышеупомянутая часть о Java и генерации GC не соответствует действительности. Подробности смотрите ниже:

В виртуальных машинах 1.0 и 1.1 использовался сборщик меток, который мог бы fragmentировать кучу после сбора мусора. Начиная с Java 1.2, виртуальные машины переключились на коллективный коллекционер, который имеет гораздо более эффективное деfragmentационное поведение (см. Теорию и практику Java: garbage collection и производительность ).

Таким образом, Java на самом деле имеет поколения GC на века. Что нового в Java 6 является сборщик мусора первого мусора (G1), который доступен в Java 6u14. Согласно статье, заявляющей о выпуске в версии 1.6.0_14 : она не включена по умолчанию. Параллельный коллектор по-прежнему является GC по умолчанию и является наиболее эффективным GC для обычного бытового использования. G1 означает альтернативу для параллельного коллектора. Он спроектирован так, чтобы быть более предсказуемым и обеспечивать быстрое распределение с дизайном областей памяти.

  • Это зависит от того, как скомпилирована программа JIT.
  • Извне мы не можем точно сказать, когда он будет работать.
  • Это следует за некоторым алгоритмом, который зависит от этого конкретного GC.
  • Виртуальная машина Java работает на клиентской машине с некоторой виртуальной памятью в случае, если по умолчанию используется Windows 4 ГБ. Это также зависит от этой свободной виртуальной памяти в это конкретное время.

Вы можете попробовать эту небольшую программу, чтобы проверить поведение GC

public class GCTest { final int NELEMS = 50000; void eatMemory() { int[] intArray = new int[NELEMS]; for (int i=0; i 

возможный выход - может быть разным в вашем случае

 free memory before creating array: 4054912 free memory after creating array: 3852496 free memory after running gc(): 4064184 

Проверьте эту ссылку http://www.devdaily.com/java/edu/pj/pj010008/

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

Для того, чтобы спустить сборщик мусора HotSpot (общий, который поставляется с Java) и как он настроен, вы можете проверить эту ссылку

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

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

Если вам интересно, что происходит в вашей программе и когда, тогда исследуйте инструмент «jvisualvm» в последних версиях Java 6 JDK. Это действительно здорово заглянуть внутрь.

Сборщик мусора работает, когда ему нужны ресурсы и на регулярной основе, на которые вы можете влиять, сообщая, когда самое время потратить CPU на сбор, используя System.gc ()

Вы можете помочь сборщику мусора, явно опуская ссылки, например, предоставив своим объектам методы init() которые распределяют ресурсы и методы cleanup() которые явно очищают эти ресурсы и обнуляют их ссылки. Путем обнуления ссылок самостоятельно вы запрещаете сборщику мусора tye от поиска кластеров объектов, которые имеют больше путей к корню.

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

Ненужные объекты – это объекты, для которых нет ссылки (адреса).

Для объектов, имеющих право на сборщик мусора, есть в основном 4 балла.

  1. Нулевая ссылка

    Сборщик мусора может удалить объект, если ссылочной переменной объекта присвоено значение null в качестве значения

      A a = new A(); a = null; 
  2. Переназначение

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

      A a = new A(100); a =new A(200); 
  3. Локальная область

    Если в блоке создается объект, объект имеет право на сборку сборок мусора, которая блокирует.

      if(condition){ A a = new A(); } 
  4. изоляция

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

      class A{ A r; A(int i){ //something } } A a1 = new A(100); a1.r = new A(101); a1.rr = new A(102); a1.rrr = a1; a1 = null //all ojects are eligible to garbage collector 
  • Спящий критерий: соединение таблицы без сопоставленной ассоциации
  • В Java, как мне получить разницу в секундах между двумя датами?
  • «Автоматические обновления» для приложения Java (desktop)?
  • Преобразование JSON в XML в Java
  • Невозможно загрузить 64-битные библиотеки SWT на 32-разрядную JVM (заменяя SWT-файл)
  • Учебники о javaagents
  • Знак подчеркивания Java 7 в числовых литералах
  • Инициализация нескольких переменных для одного и того же значения в Java
  • Какова цель подстановочных знаков и как они отличаются от дженериков?
  • Поведение оператора return в catch и, наконец,
  • Почему AspectJ не компилируется во время работы Spring @Configurable?
  • Давайте будем гением компьютера.