Автор оригинала: Attila Fejér.
1. введение
Java 11 представила сборщик мусора No-Op под названием Epsilon, который обещает наименьшие возможные накладные расходы GC .
В этом коротком уроке мы рассмотрим, как работает Epsilon, и упомянем общие случаи использования.
2. Быстрая Практическая Работа
Давайте начнем с того, что испачкаем руки, и возьмем Epsilon GC на спин!
Сначала нам понадобится приложение, которое создает мусор:
class MemoryPolluter { static final int MEGABYTE_IN_BYTES = 1024 * 1024; static final int ITERATION_COUNT = 1024 * 10; static void main(String[] args) { System.out.println("Starting pollution"); for (int i = 0; i < ITERATION_COUNT; i++) { byte[] array = new byte[MEGABYTE_IN_BYTES]; } System.out.println("Terminating"); } }
Этот код создает массивы размером в один мегабайт в цикле. Поскольку мы повторяем цикл 10240 раз, это означает, что мы выделяем 10 гигабайт памяти, что, вероятно, превышает доступный максимальный размер кучи.
Мы также предоставили некоторые вспомогательные отпечатки, чтобы увидеть, когда приложение завершится.
Чтобы включить Epsilon GC, нам нужно передать следующие аргументы виртуальной машины:
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
И когда мы запускаем приложение, мы получаем следующую ошибку:
Starting pollution Terminating due to java.lang.OutOfMemoryError: Java heap space
Однако, когда мы запускаем одно и то же приложение со стандартными параметрами виртуальной машины, оно завершается нормально:
Starting pollution Terminating
Почему первый запуск провалился? Похоже, что даже самые простые сборщики мусора могли бы очистить детскую игру, которую мы только что продемонстрировали!
Итак, давайте взглянем на концепции, лежащие в основе Epsilon GC, чтобы понять, что только что произошло.
3. Как работает Epsilon GC
Эпсилон-это сборщик мусора без операций.
JEP 318 объясняет, что ” [Epsilon] … обрабатывает выделение памяти, но не реализует никакого реального механизма восстановления памяти. Как только доступная куча Java будет исчерпана, JVM завершит работу. “
Итак, это объясняет, почему наше приложение завершилось ошибкой OutOfMemoryError.
Но возникает вопрос: зачем нам нужен сборщик мусора, который не собирает никакого мусора?
Есть некоторые случаи, когда мы знаем, что доступной кучи будет достаточно, поэтому мы не хотим, чтобы JVM использовала ресурсы для выполнения задач GC.
Некоторые примеры таких случаев (также из соответствующего JEP):
- Тестирование производительности
- Проверка давления в памяти
- Тестирование интерфейса виртуальной машины
- Чрезвычайно недолговечные рабочие места
- Улучшения задержки последней капли
- Повышение пропускной способности в последнюю очередь
4. Заключение
В этой короткой статье мы узнали об Epsilon, GC без операций, доступном в Java 11. Мы узнали о последствиях его использования и рассмотрели некоторые случаи, когда он может быть полезен.
Как обычно, примеры доступны на GitHub .