Рубрики
Без рубрики

Сборка мусора на Java

Сборка мусора на Java, Java GC, сборщик мусора, G1GC, –XX:+UseG1GC, Сборщик мусора Java 9 G1, Сборщик мусора Java, Последовательный сборщик мусора Java, Параллельный сборщик мусора

Автор оригинала: Pankaj Kumar.

Сборка мусора в java является одной из передовых тем. Знание Java GC помогает нам в точной настройке производительности нашего приложения во время выполнения.

Сборка мусора на Java

  • В Java программистам не нужно заботиться об уничтожении объектов, которые вышли из употребления. Сборщик мусора заботится об этом.
  • Сборщик мусора-это Демонический поток , который продолжает работать в фоновом режиме. В принципе, это освобождает память кучи , уничтожая недостижимые объекты.
  • Недостижимые объекты-это те, на которые больше не ссылается ни одна сторона программы.
  • Мы можем выбрать сборщик мусора для нашей java-программы с помощью параметров JVM , мы рассмотрим их в следующем разделе этого руководства.

Как работает Автоматическая Сборка Мусора?

Автоматическая сборка мусора-это процесс просмотра памяти кучи, идентификации(также известной как “маркировка”) недостижимых объектов и их уничтожения с помощью уплотнения.

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

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

Это поведение было использовано для повышения производительности JVM, и принятая методология обычно называется сборкой мусора поколений. В этом методе пространство кучи разделяется на поколения, такие как Молодое поколение, Старое или Штатное поколение и Постоянное поколение.

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

Старое поколение используется для хранения давно сохранившихся объектов. Как правило, для объекта молодого поколения устанавливается пороговое значение, и при достижении этого возраста объект перемещается в старое поколение. В конце концов, старое поколение должно быть собрано. Это событие называется крупной сборкой мусора (major garbage collection). Часто это происходит намного медленнее, потому что в нем задействованы все живые объекты. Кроме того, существует полная GC, что означает очистку всей Кучи – как для молодого, так и для старшего поколения.

Наконец, вплоть до Java 7 существовало Постоянное поколение (или PermGen), которое содержало метаданные, требуемые JVM для описания классов и методов, используемых в приложении. Он был удален в Java 8.

Сборщики Мусора Java

На самом деле JVM предоставляет четыре разных сборщика мусора, все они относятся к разным поколениям. У каждого из них есть свои преимущества и недостатки. Выбор того, какой сборщик мусора использовать, лежит на нас, и могут быть существенные различия в пропускной способности и паузах приложений.

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

Итак, четыре типа сборщиков мусора::

Последовательный GC

Это самый простой сборщик мусора, предназначенный для однопоточных систем и небольшого размера кучи. Он замораживает все приложения во время работы. Может быть включен с помощью опции -XX:+UseSerialGC JVM.

Параллельная/пропускная способность GC

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

Коллектор CMS

Алгоритм сборщика CMS (“параллельная разметка”) использует несколько потоков (“параллельная”) для сканирования кучи (“отметка”) на наличие неиспользуемых объектов, которые могут быть переработаны (“развертка”).

Этот сборщик переходит в режим Stop-The-World(STW) в двух случаях: -При инициализации начальной маркировки корней, т. Е. объектов старого поколения, доступных из точек входа потока или статических переменных-Когда приложение изменило состояние кучи во время одновременного выполнения алгоритма и заставило его вернуться и сделать некоторые последние штрихи, чтобы убедиться, что у него отмечены правильные объекты.

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

Коллектор G1

И последнее, но не менее важное-это сборщик мусора, предназначенный для кучи размером более 4 ГБ. Он делит размер кучи на области размером от 1 МБ до 32 МБ в зависимости от размера кучи.

Существует параллельная фаза глобальной маркировки для определения живости объектов по всей куче. После завершения этапа маркировки G1 узнает, какие области в основном пусты. Сначала он собирает недостижимые объекты из этих областей, что обычно дает большое количество свободного пространства. Таким образом, G1 сначала собирает эти области(содержащие мусор), и, следовательно, сначала получает название “Мусор”. G1 также использует модель прогнозирования паузы для достижения заданного пользователем целевого времени паузы. Он выбирает количество регионов для сбора на основе указанного целевого времени паузы.

Цикл сбора мусора G1 включает в себя этапы, как показано на рисунке:

  1. Фаза только для молодежи: Эта фаза включает в себя только объекты молодого поколения и продвигает их старому поколению. Переход между фазой только для молодежи и фазой освоения пространства начинается, когда старое поколение занято до определенного порога, т. Е. порог заполнения Начальной Кучи. В это время G1 планирует начальную коллекцию “Только для молодых” вместо обычной коллекции “только для молодых”.
    1. Начальная маркировка: Этот тип коллекции запускает процесс маркировки в дополнение к обычной коллекции, предназначенной только для молодых. Одновременная маркировка определяет все существующие в настоящее время объекты в регионах старого поколения, которые будут сохранены для следующего этапа освоения пространства. Хотя маркировка еще не полностью завершена, могут возникать регулярные коллекции только для молодых. Маркировка завершается двумя специальными паузами остановки мира: Замечанием и очисткой.
    2. Примечание: Эта пауза завершает саму маркировку и выполняет глобальную обработку ссылок и выгрузку классов. Между замечанием и очисткой G1 одновременно вычисляет сводную информацию о живучести, которая будет доработана и использована во время паузы очистки для обновления внутренних структур данных.
    3. Очистка: Эта пауза также занимает полностью пустые области и определяет, действительно ли последует фаза восстановления пространства. Если за этим следует фаза освоения пространства, фаза “Только для молодых” завершается одной коллекцией “только для молодых”.
  2. Фаза освоения пространства: Эта фаза состоит из нескольких смешанных коллекций -в дополнение к регионам молодого поколения также эвакуируются живые объекты из регионов старого поколения. Фаза освоения пространства заканчивается, когда G1 определяет, что эвакуация большего количества регионов старого поколения не даст достаточного свободного пространства, стоящего затраченных усилий.

G1 можно включить с помощью флага –XX:+UseG1GC .

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

В Java 8 прекрасная оптимизация обеспечивается сборщиком G1, который называется дедупликация строк . Как мы знаем, массивы символов, представляющие наши строки, занимают большую часть нашего пространства кучи. Была проведена новая оптимизация, которая позволяет сборщику G1 идентифицировать строки, которые дублируются более одного раза в нашей куче, и изменять их, чтобы они указывали на один и тот же внутренний массив символов [], чтобы избежать ненужного размещения нескольких копий одной и той же строки в куче. Мы можем использовать аргумент -XX:+UseStringDeduplication JVM, чтобы включить эту оптимизацию.

G1 является сборщиком мусора по умолчанию в JDK 9.

Java 8 ПермГен и Метапространство

Как упоминалось ранее, постоянное пространство генерации было удалено с Java 8. Итак, теперь JVM JDK8 HotSpot использует собственную память для представления метаданных класса, которое называется Metaspace.

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

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

Вот и все для сборки мусора на java. Я надеюсь, что вы получили представление о различных сборщиках мусора, которые у нас есть на java.

Ссылки: Документация Oracle , G1 GC .