Какова наилучшая конфигурация 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, чтобы просмотреть статистику коллектора.