Сборщики мусора JVM

1. Обзор

В этом кратком руководстве мы покажем основы различных реализаций JVM Garbage Collection (GC) Кроме того, мы узнаем, как включить сборку мусора определенного типа в наших приложениях.

** 2. Краткое введение в сборку мусора

**

Как видно из названия, Garbage Collection имеет дело с поиском и удалением мусора из памяти. Однако в действительности Garbage Collection отслеживает каждый объект, доступный в пространстве кучи JVM, и удаляет неиспользуемые объекты.

Проще говоря, GC работает в два простых шага, известных как Mark и Sweep:

  • Mark - это где сборщик мусора определяет, какие части

память используется и которые не Sweep - ** этот шаг удаляет объекты, идентифицированные на этапе «пометка»

  • Преимущества: **

  • Нет ручного выделения памяти/обработки освобождения, потому что не используется

пространство памяти автоматически обрабатывается GC ** Нет накладных расходов на обработку

https://en.wikipedia.org/wiki/Dangling pointer ** Автоматически https://en.wikipedia.org/wiki/Memory leak[утечка памяти]

управление ( GC само по себе не может гарантировать полное доказательство решения утечки памяти, однако, оно заботится о значительной части)

  • Недостатки: **

  • Поскольку JVM должен отслеживать создание/удаление ссылки на объект,

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

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

освободить объекты, которые больше не нужны ** Использование некоторых реализаций GC может привести к остановке приложения

непредсказуемо ** Автоматизированное управление памятью не будет таким эффективным, как

ручное распределение/освобождение памяти

3. GC Реализации

JVM имеет четыре типа реализации GC :

  • Серийный сборщик мусора

  • Параллельный сборщик мусора

  • CMS Сборщик мусора

  • G1 Сборщик мусора

3.1. Серийный сборщик мусора

Это самая простая реализация GC, так как она в основном работает с одним потоком. В результате эта реализация GC замораживает все потоки приложения при запуске . Следовательно, не рекомендуется использовать его в многопоточных приложениях, таких как серверные среды.

Однако на QCon 2012 инженеры Twitter рассказывали о https://www.infoq.com/presentations/JVM-Performance-Tuning-twitter-QCon-London-2012 ---- хороший способ лучше понять этого коллекционера.

Serial GC является сборщиком мусора для большинства приложений, которые не имеют небольших требований к времени паузы и работают на компьютерах в стиле клиента. Чтобы включить Serial Garbage Collector , мы можем использовать следующий аргумент:

java -XX:+UseSerialGC -jar Application.java

** 3.2. Параллельный сборщик мусора

**

Это GC по умолчанию JVM и иногда называется сквозным коллектором. В отличие от Serial Garbage Collector , это использует несколько потоков для управления пространством кучи . Но он также останавливает другие потоки приложения при выполнении GC .

Если мы используем эту GC , мы можем указать максимальную сборку мусора threads и время паузы, пропускную способность и footprint (размер кучи).

Число потоков сборщика мусора можно контролировать с помощью параметра командной строки -XX: ParallelGCThreads = <N> .

Максимальное время паузы (промежуток[в миллисекундах]между двумя GC ) указывается с помощью параметра командной строки -XX: MaxGCPauseMillis = <N> .

Максимальный целевой показатель пропускной способности (измеряемый относительно времени, затраченного на сборку мусора, по сравнению с временем, потраченным вне сбора мусора) задается параметром командной строки -XX: GCTimeRatio = <N> .

Максимальный объем кучи (объем памяти кучи, который требуется программе во время работы) задается с помощью параметра -Xmx <N> .

Чтобы включить Parallel Garbage Collector , мы можем использовать следующий аргумент:

java -XX:+UseParallelGC -jar Application.java

3.3. CMS Сборщик мусора

Реализация Concurrent Mark Sweep (CMS) использует несколько потоков сборщика мусора для сбора мусора. Он предназначен для приложений, которые предпочитают более короткие паузы сбора мусора и могут позволить себе совместно использовать ресурсы процессора со сборщиком мусора во время работы приложения.

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

Здесь необходимо отметить следующее: поскольку этот GC является одновременным, вызов явной сборки мусора, такой как использование System.gc () во время работы параллельного процесса, приведет к https://blogs.oracle.com/jonthecollector/entry/what the heck s a[ Сбой режима прерывания/прерывание ].

Если более 98% общего времени затрачивается на сборку мусора CMS и восстанавливается менее 2% кучи, CMS collector создает OutOfMemoryError . При необходимости эту функцию можно отключить, добавив параметр -XX: -UseGCOverheadLimit в командную строку.

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

Чтобы включить CMS Garbage Collector , мы можем использовать следующий флаг:

java -XX:+UseParNewGC -jar Application.java

3.4. G1 Сборщик мусора

G1 (Garbage First) Garbage Collector предназначен для приложений, работающих на многопроцессорных компьютерах с большим объемом памяти. Он доступен с JDK7, обновление 4 и в более поздних выпусках.

G1 сборщик заменит CMS сборщик, так как он более эффективен.

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

При выполнении сборок мусора G1 показывает параллельную фазу глобальной маркировки (то есть фазу 1, известную как Marking) , чтобы определить жизнеспособность объектов в куче.

После завершения фазы маркировки G1 знает, какие регионы в основном пусты. Сначала он собирается в этих областях, что обычно дает значительное количество свободного пространства (то есть фаза 2, известная как __Sweeping). Именно поэтому этот метод сбора мусора называется Garbage-First.

Чтобы включить сборщик мусора __G1, мы можем использовать следующий аргумент:

java -XX:+UseG1GC -jar Application.java

** 3.5. Java 8 Изменения

**

Java 8u20 представил еще один параметр JVM для сокращения ненужного использования памяти путем создания слишком большого количества экземпляров одной и той же строки String. Это оптимизирует кучу памяти путем удаления дублирующихся значений String в глобальный одиночный массив char[] .

Этот параметр можно включить, добавив - XX: + UseStringDeduplication в качестве параметра JVM .

4. Заключение

В этом кратком руководстве мы рассмотрели различные реализации JVM Garbage Collection и их варианты использования.

Более подробную документацию можно найти по адресу here .