Какова наилучшая конфигурация GC и памяти для системы реального времени, которая хочет минимизировать латентность GC на обычной Sun/Oracle Hotspot JVM?

Вопрос в значительной степени говорит обо всем. Какую поддержку JVM GC мы должны использовать и с какой конфигурацией минимизировать влияние GC в приложении?

EDIT: Linux Ubuntu 64-бит:

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)

Ответ 1

Начиная с J2SE 5.0, параллельный коллектор выбирается по умолчанию на машинах класса серверов, как описано в документе Ergonomics Garbage Collector Ergonomics. Кроме того, в параллельном коллекторе используется метод автоматической настройки, который позволяет указать желаемое поведение, а не размеры поколений и другие детали настройки низкого уровня. Поведение, которое можно указать, следующее:

Максимальное время паузы для сбора мусора пропускная способность След (т.е. Размер кучи) Максимальная цель времени паузы задается с помощью опции командной строки -XX: MaxGCPauseMillis =. Это интерпретируется как намек на то, что требуются паузы в миллисекундах или менее; по умолчанию отсутствует максимальная цель паузы. Если задана цель паузы, размер кучи и другие параметры сбора мусора, связанные с , корректируются, чтобы сохранить паузы в сборке мусора короче указанного значения. Обратите внимание, что эти настройки могут привести к тому, что сборщик мусора уменьшит общую пропускную способность приложения, а в некоторых случаях не может быть достигнута желаемая цель времени паузы.

Выдержка из http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#par_gc.ergonomics

Ответ 2

Вы задавали вопросы об этой проблеме в течение нескольких дней. Я считаю, что корень ваших проблем заключается в том, что вы пытаетесь получить производительность в реальном времени из платформ Java, которые просто не предназначены для ее предоставления.

Если вы хотите работать в реальном времени (в истинном смысле этого слова), вам нужна виртуальная машина Java, которая реализует расширения реального времени RTSJ. Эта страница, в которой перечислены некоторые реализации. Обратите внимание, что для получения производительности в реальном времени на уровне приложений Java вам также необходимо работать на платформе ОС реального времени.


С другой стороны, если вы просто хотите сборку мусора с низкой паузой без каких-либо сильных гарантий производительности в реальном времени, тогда документы настройки GC GC объясняют, как это сделать. См. Ответ Чака Фрикано.

Но будьте осторожны, что существует ограничение на то, что можно достичь таким образом. В частности, если ваше приложение слишком сильно подчеркивает GC, оно не сможет удовлетворить ваши цели на время паузы. И оптимальные настройки для параметров настройки, вероятно, будут специфичными для платформы/оборудования, а также зависят от приложения.

Нет простых ответов.

И, конечно же, нет никакой конфигурации одного размера для минимизации задержки. Даже для конкретной версии JVM, операционной системы и аппаратной платформы.

Ответ 3

Чтобы правильно настроить GC, вам необходимо понять жизненный цикл объекта в вашем приложении. Как уже упоминалось, ответов нет. То, что сработало для меня, - это определение молодого поколения, поэтому большинство объектов умирают там, используя CMS и устанавливая начальную фракцию, чтобы она не запускалась постоянно. Вот мои параметры:

-server -Xms4000M -Xmx4000M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=60 -XX:MaxTenuringThreshold=4 -XX:MaxNewSize=384m -XX:NewSize=384m -XX:SurvivorRatio=12 -Xloggc:/opt/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

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