Как добиться детерминированной GC-паузы в Java 7+? - PullRequest
0 голосов
/ 24 июня 2018

Поскольку после Jrockit больше не доступен, значит, есть ли способ добиться детерминированной (не более x мс) паузы ГХ?Я пытаюсь с G1 GC в java_8_65, но это недетерминировано, и часто я вижу молодые паузы gc больше, чем -XX:MaxGCPauseMillis, что ожидается, но не в соответствии с моим требованием.

Ответы [ 4 ]

0 голосов
/ 03 октября 2018

Релиз Java 11 содержит новый сборщик мусора, ZGC , который обещает очень малое время паузы.

Цель этого проекта - создать масштабируемый сборщик мусора с малой задержкой, способный обрабатывать кучи размером от нескольких гигабайт до нескольких терабайт, с временем паузы GC, не превышающим 10 мс.

0 голосов
/ 25 июня 2018

Простой ответ - нет. Все GC, используемые Hotspot и другими JVM (например, Zing из Azul , на котором я работаю) по своей сути недетерминированы. Вы, безусловно, можете настроить GC для достижения вашей цели задержки в большинстве случаев, и использование Zing даст вам гораздо более надежные результаты, потому что он выполняет сжатие коллекции по-настоящему параллельно с потоками приложения (поэтому, поэтому не имеет остановки мировые паузы).

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

Единственный способ получить истинное детерминированное поведение, которое вы ищете, это использовать JVM реального времени (посмотрите RTSJ spec ), который также потребует операционная система в реальном времени. Недостатком этого является частая пропускная способность.

0 голосов
/ 30 июня 2018

Еще одним вариантом может быть OpenJ9 Metronome GC .Насколько я знаю, это дизайн для детерминированных коротких пауз для приложений реального времени.Согласно документации значение по умолчанию составляет 10 миллисекунд.Тем не менее, это, конечно, потребует больше процессора и больше дизайна для небольших куч.

Я никогда не использовал его, поэтому не могу поделиться опытом.

0 голосов
/ 25 июня 2018

Ваши варианты

  • выполнить некоторую настройку, пока G1 не будет работать как положено
  • переключиться на другой коллектор, доступный в используемой вами JVM, например, CMS
  • переключиться на другую JVM, которая предлагает коллекторы с более надежными гарантиями
  • Оптимизируйте ваше приложение, чтобы снизить давление ГХ или поведение в худшем случае
  • добавляет больше оборудования к проблеме (больше или быстрее процессорных ядер, больше оперативной памяти)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...